iOS入门小知识-数组

iOS入门小知识-数组,第1张

C数组主要用于存储基本数据类型 (int, char, float, double) ,以及复合数据类型 (int , int[6])

OC数组是一个对象,主要用于存储“对象”,可以存储不同类型的对象,数组分不可变数组 NSArray 和可变数组 NSMutableArray ,数组中存储的其实是每个对象的地址,并不是真的存储对象,所以通常一个对象会被存储到多个数组中,但所存储的对象地址指向的都是同一个对象的内存空间,也就是同一个对象

NSMutableArray 继承自 NSArray ,所以基本可以使用 NSArray 构造方法来创建 NSMutableArray 对象,不同的是 NSMutableArray 可以在原数组内进行元素的 增 、 删 , 改 , 查

一、自带剪切板 *** 作的原生UI控件

在iOS的UI系统中,有3个控件自带剪切板 *** 作,分别是UITextField、UITextView与UIWebView。在这些控件的文字交互处进行长按手势可以在屏幕视图上唤出系统的剪切板控件,用户可以进行复制、粘贴,剪切等 *** 作

二、系统的剪切板管理类UIPasteboard

实际上,当用户通过上面的空间进行复制、剪切等 *** 作时,被选中的内容会被存放到系统的剪切板中,并且这个剪切板并不只能存放字符串数据,其还可以进行数据与网址URL数据的存放。这个剪切板就是UIPasteboard类,开发者也可以直接通过它来 *** 作数据进行应用内或应用间传值。

UIPasteboard类有3个初始化方法,如下:

//获取系统级别的剪切板

+ (UIPasteboard )generalPasteboard;

//获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建

+ (nullable UIPasteboard )pasteboardWithName:(NSString )pasteboardName create:(BOOL)create;

//获取一个应用内可用的剪切板

+ (UIPasteboard )pasteboardWithUniqueName;

上面3个初始化方法,分别获取或创建3个级别不同的剪切板,系统级别的剪切板在整个设备中共享,即是应用程序被删掉,其向系统级的剪切板中写入的数据依然在。自定义的剪切板通过一个特定的名称字符串进行创建,它在应用程序内或者同一开发者开发的其他应用程序中可以进行数据共享。第3个方法创建的剪切板等价为使用第2个方法创建的剪切板,只是其名称字符串为nil,它通常用于当前应用内部。

注意:使用第3个方法创建的剪切板默认是不进行数据持久化的,及当应用程序退出后,剪切板中内容将别抹去。若要实现持久化,需要设置persistent属性为YES。

UIPasteboard中常用方法及属性如下:

//剪切板的名称

@property(readonly,nonatomic) NSString name;

//根据名称删除一个剪切板

+ (void)removePasteboardWithName:(NSString )pasteboardName;

//是否进行持久化

@property(getter=isPersistent,nonatomic) BOOL persistent;

//此剪切板的改变次数 系统级别的剪切板只有当设备重新启动时 这个值才会清零

@property(readonly,nonatomic) NSInteger changeCount;

下面这些方法用于设置与获取剪切板中的数据:

最新一组数据对象的存取:

/获取剪切板中最新数据的类型

- (NSArray)pasteboardTypes;

//获取剪切板中最新数据对象是否包含某一类型的数据- (BOOL)containsPasteboardTypes:(NSArray)pasteboardTypes;

//将剪切板中最新数据对象某一类型的数据取出

- (nullable NSData )dataForPasteboardType:(NSString )pasteboardType;

//将剪切板中最新数据对象某一类型的值取出

- (nullable id)valueForPasteboardType:(NSString )pasteboardType;

//为剪切板中最新数据对应的某一数据类型设置值

- (void)setValue:(id)value forPasteboardType:(NSString )pasteboardType;

//为剪切板中最新数据对应的某一数据类型设置数据

- (void)setData:(NSData )data forPasteboardType:(NSString )pasteboardType;

多组数据对象的存取:

 //数据组数@property(readonly,nonatomic) NSInteger numberOfItems;

//获取一组数据对象包含的数据类型

- (nullable NSArray )pasteboardTypesForItemSet:(nullable NSIndexSet)itemSet;

//获取一组数据对象中是否包含某些数据类型

- (BOOL)containsPasteboardTypes:(NSArray)pasteboardTypes inItemSet:(nullable NSIndexSet )itemSet;

//根据数据类型获取一组数据对象

- (nullable NSIndexSet )itemSetWithPasteboardTypes:(NSArray )pasteboardTypes;

//根据数据类型获取一组数据的值

- (nullable NSArray )valuesForPasteboardType:(NSString )pasteboardType inItemSet:(nullable NSIndexSet )itemSet;

//根据数据类型获取一组数据的NSData数据

- (nullable NSArray )dataForPasteboardType:(NSString )pasteboardType inItemSet:(nullable NSIndexSet )itemSet;

//所有数据对象

@property(nonatomic,copy) NSArray items;

//添加一组数据对象

- (void)addItems:(NSArray> )items;

上面方法中很多需要传入数据类型参数,这些参数是系统定义好的一些字符窜,如下:

//所有字符串类型数据的类型定义字符串数组

UIKIT_EXTERN NSArrayUIPasteboardTypeListString;

//所有URL类型数据的类型定义字符串数组

UIKIT_EXTERN NSArrayUIPasteboardTypeListURL;

//所有数据的类型定义字符串数据

UIKIT_EXTERN NSArrayUIPasteboardTypeListImage;

//所有颜色数据的类型定义字符串数组

UIKIT_EXTERN NSArrayUIPasteboardTypeListColor;

相比于上面两组方法,下面这些方法更加面向对象,在开发中使用更加方便与快捷:

//获取或设置剪切板中的字符串数据

@property(nullable,nonatomic,copy) NSString string;

//获取或设置剪切板中的字符串数组

@property(nullable,nonatomic,copy) NSArraystrings;

//获取或设置剪切板中的URL数据

@property(nullable,nonatomic,copy) NSURL URL;

//获取或设置剪切板中的URL数组

@property(nullable,nonatomic,copy) NSArrayURLs;

//获取或s何止剪切板中的数据

@property(nullable,nonatomic,copy) UIImage image;

//获取或设置剪切板中的数组

@property(nullable,nonatomic,copy) NSArrayimages;

//获取或设置剪切板中的颜色数据

@property(nullable,nonatomic,copy) UIColor color;

//获取或设置剪切板中的颜色数组

@property(nullable,nonatomic,copy) NSArraycolors;

对剪切板的某些 *** 作会触发如下通知:

//剪切板内容发生变化时发送的通知

UIKIT_EXTERN NSString const UIPasteboardChangedNotification;

//剪切板数据类型键值增加时发送的通知

UIKIT_EXTERN NSString const UIPasteboardChangedTypesAddedKey;

//剪切板数据类型键值移除时发送的通知

UIKIT_EXTERN NSString const UIPasteboardChangedTypesRemovedKey;

//剪切板被删除时发送的通知

UIKIT_EXTERN NSString const UIPasteboardRemovedNotification;

三、复制的简单例子

创建一个CopyView

#import "CopyViewh"

@interface CopyView ()

@property (strong, nonatomic) UIImageView img1;

@property (strong, nonatomic) UIImageView img2;

@end 

@implementation CopyView

-(UIImageView )img1{  

if (_img1 == nil) {   

 _img1 = [[UIImageView alloc] initWithFrame:CGRectMake(100f, 200f, 1000f, 1000f)]; 

   NSString path = [[NSBundle mainBundle] pathForResource:@"NetworldImage" ofType:@"jpg"];

    _img1image = [UIImage imageWithContentsOfFile:path]; 

 }  

return _img1;

-(UIImageView )img2{  if (_img2 == nil) { 

   _img2 = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(selfimg1frame)+500f, 200f, 1000f, 1000f)];

    _img2backgroundColor = [UIColor lightGrayColor]; 

 }  

return _img2;

}

 - (instancetype)initWithFrame:(CGRect)frame {

  self = [super initWithFrame:frame];

  if (self) { 

   selfbackgroundColor = [UIColor whiteColor];

    [self addSubview:selfimg1];

    [self addSubview:selfimg2];

  }  

return self;

-(BOOL)canBecomeFirstResponder{

  return YES;

}

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{

  NSArray methodNameArr = @[@"copy:",@"cut:",@"select:",@"selectAll:",@"paste:"];

  if ([methodNameArr containsObject:NSStringFromSelector(action)]) { 

   return YES; 

 }  

return [super canPerformAction:action withSender:sender];

-(void)copy:(id)sender{ 

 UIPasteboard pasteboard = [UIPasteboard generalPasteboard];

  [pasteboard setImage:selfimg1image];

}

 -(void)paste:(id)sender{ 

 UIPasteboard pasteboard = [UIPasteboard generalPasteboard];

  selfimg2image = [pasteboard image];

-(void)touchesBegan:(NSSet)touches withEvent:(UIEvent )event{

[self becomeFirstResponder];

UIMenuController menuController = [UIMenuController sharedMenuController];

[menuController setTargetRect:selfimg1frame inView:self];

[menuController setMenuVisible:YES animated:YES];

}

@end

在controller中

#import "ViewControllerh"

#import "CopyViewh"

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

CopyView cv = [[CopyView alloc] initWithFrame:selfviewbounds];

selfview = cv;

}

@end

iOS开发,plist文件读写那些事 - (jianshucom)

NSUserDefaults存储轻量级 的本地数据 ,比如要保存一个登陆界面的数据,用户名、密码之类的。

支持的数据类型有 NSString、 NSNumber、NSInteger、NSFloat、BOOL、NSArray、NSDictionary、NSDate、 等系统定义的数据类型。

用NSUserDefaults存储的数据下次程序运行的时候依然存在 它的数据存储在应用程序内置的一个plist文件里, 在/Library/Prefereces沙盒路径下

NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

使用NSKeyedArchiver 对数据进行 归档 反归档(将自定义类型转换为NSData类型:)

NSuserDefaults 的坑

iOS 最终,我还是决定放弃使用NSUserDefaults了 - (jianshuio)

归档: ,就是将数据写到一个文件里面去。一般我们的应用的变量常量之类的数据都是在内存里面的,只要APP关闭,这些数据都会丢失。但是把数据存储到文件里面去,就能将数据保存到本地磁盘里面(目前iOS基本就是在沙盒里面 *** 作了),不管是APP关闭还是重启设备,下次启动APP的时候都能够读出来。

解档: (别人也叫反归档),就是将数据从文件里面读取出来。在程序里面使用。

iOS数据持久化:使用NSKeyedArchiver进行数据归档 - (jianshucom)

iOS 开发Core Data使用方法 – 技术狗 (jishudogcom)

IOS 开发文件 *** 作——NSFileManager - 星语海蓝 - 博客园 (cnblogscom)

(15条消息) iOS文件 *** 作_你有故事,我囿酒-CSDN博客

参考:

iOS开发 - 关于 NSUserDefaults 的使用 - (jianshucom)

在开发过程中,经常会用到NSArray,然后找出数组中的最大值、最小值,很多时候我们一般用for循环来封装一个算法求最值,虽然可以但是还是不够快速。其实Apple底层可我们封装了一个十分好用的API,可以通过valueForKeyPath方法来设置你想要获取的一些数组。

NSMutableArray array = [NSMutableArray array];

for (int i = 0; i < 10; i++) {

    CGFloat num = arc4random() % 100 + 1;

    [array addObject:[NSNumber numberWithFloat:num]];

}

CGFloat maxValue = [[array valueForKeyPath:@"@maxfloatValue"] floatValue];

CGFloat minValue = [[array valueForKeyPath:@"@minfloatValue"] floatValue];

min、max是NSArray的私有属性,通过语法是拿不到的,会报错的。类似这种私有属性还有

@”@avgfloatValue” (获取平均值), 

@”@countfloatValue”(获取数组大小) 

@"@sumfloatValue"(求和)

还可以去重

NSArray array = @[@"a", @"wechat", @"qq", @"msn", @"wechat"];

NSArray deleltNewA = [array valueForKeyPath:@"@distinctUnionOfObjectsself"];

您好,原因是这样的

您所使用的[NSArray arrayWithObjects:nil]是一个类方法,如果您进入它的注释说明您就能看到这个方法的返回值是一个id类型,这就是为什么您可以用一个类定义的对象去接受还能执行的原因

在OC中,id类型可以代表任何类型,但是之前使用的是数组的类方法,也就是说,只要这个类方法里面只要包含元素,系统就会认为这是一个数组类型的变量,您用自定义的类的对象去接收一个数组类型的地址,当然会引起指针错误并且不能为您执行了

为什么单有一个nil可以执行而系统不报错呢?因为OC是一门弱类型的语言,顾名思义,就是OC不会太在乎类和类之间的界限,这样尽管方便了编译,但是却不好查找错误。所以——当您使用只有一个nil的数组时,系统会把这个数组认定为一个空的对象,而您的receipes类中也没有定义任何数据,所以同为nil,系统当然可以将这行代码执行下去了。

但是我非常不建议您这样使用,如果您学了手动内存管理后您就会知道,当您使用了这个类方法之后,尽管 *** 作是毫无意义并且看上去人畜无害的,但是系统却会为您的这行代码而给recipe对象增加一个计数器(retain count),也就是说recipe您创建的时候内存计数器为1,而您使用这行代码之后计数器就为2了。如果您不注意并且只在程序结束时只release了一次,那么这会引起非常严重的后果——您可能会遇到内存泄露的问题。并且recipe无法被完全释放

以上就是关于iOS入门小知识-数组全部的内容,包括:iOS入门小知识-数组、iOS oc-剪切板、IOS 存储方式(PList、NSUserDefaults、归档、CoreData、数据库、文件)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/10160292.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存