NSArray简单细说(三)—— 数组初始化

版本记录

版本号 时间
V1.0 2017.08.24

前言

NSArray是集合类型中的一种,是OC中很重要的概念,这个是我们一定会用到的对象,下面我就继续由整体到细节,由简单到复杂的和大家说一下它的用法。感兴趣的可以看我写的上篇几篇。
1. NSArray简单细说(一)—— 整体了解
2. NSArray简单细说(二)—— 数组的创建

一、 - (instancetype)init;

这个方法没什么说的就是对象初始化函数,在以这种方式初始化了一个不可变数组之后,它不能被修改。所以一般不会NSArray用它进行初始化没有意义。

结论:简单到爆。


二、- (instancetype)initWithArray:(NSArray<ObjectType> *)array;

该方法的作用就是:通过给定的数组,初始化一个新的数组。在以这种方式初始化了一个不可变数组之后,它不能被修改。

下面看代码

- (void)demoInitWithArray
{
    NSArray *givenArr = @[@1, @2, @3, @4, @5];
    NSArray *arr = [[NSArray alloc] initWithArray:givenArr];
    NSLog(@"arr = %@", arr);
}

下面看输出结果

2017-08-24 23:39:21.848 JJOC[6849:191099] arr = (
    1,
    2,
    3,
    4,
    5
)

结论:简单,了解。


三、- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

该方法的作用就是:使用Array作为数组的数据对象的源初始化新分配的数组。

下面看一下参数和返回值:

  • array:一个包含对象的数组,用来初始化新的数组。
  • flag:如果是,数组中的每个对象都会接收到一个copyWithZone:消息来创建对象的副本必须符合NSCopying协议。 在内存管理环境中,这不是对象否则会接收到的保留消息。 然后将对象副本添加到返回的数组。如果否,则在内存管理环境中,数组中的每个对象在添加到返回的数组时都会收到一条保留消息。
  • return :初始化为包含对象的数组,或者如果标志为YES,则表示对象的数组。 返回的对象可能与原始接收者不同。

下面看一下代码

- (void)demoInitWithArrayCopyItems
{
    NSArray *givenArr = @[@1, @2, @3, @4, @5];
    NSArray *arr = [[NSArray alloc] initWithArray:givenArr copyItems:YES];
    NSLog(@"arr = %@", arr);
}

下面看输出结果

2017-08-24 23:52:15.553 JJOC[7246:203744] arr = (
    1,
    2,
    3,
    4,
    5
)

还有几点需要注意:以这种方式初始化了一个不可变数组之后,它不能被修改。copyWithZone:方法执行浅拷贝。 如果你有一个任意深度的集合,那么对于flag参数传递YES就可以执行表面下面第一级的不可变拷贝。 如果您通过NO,第一级的可变性不受影响。 在任何一种情况下,所有更深层次的可变性都不受影响。

结论:简单,了解。


四、- (NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;

该方法的作用就是:根据给定的路径获取新的数组。

下面看一下参数和返回值:

  • path:包含由writeToFile:atomically:方法生成的数组的表示形式的文件的路径。
  • return:一个数组被初始化为包含由aPath指定的文件的内容,如果无法打开文件或文件的内容无法解析为数组,则该数组将被初始化为nil。 返回的对象可能与原始接收者不同。

下面看一下代码

- (void)demoInitWithContentsOfFile
{
    NSArray *arr = [[NSArray alloc] initWithContentsOfFile:@"/Users/lucy/Desktop/demo/JJOC/JJOC/arrayTest.plist"];
    NSLog(@"arr = %@", arr);
}

下面看输出结果

2017-08-25 00:02:10.074 JJOC[7690:214690] arr = (
    three,
    two,
    one
)

还有几点需要注意:

  • aPath标识的文件中的数组表示形式只能包含属性列表对象(NSString,NSData,NSArray或NSDictionary对象)。 这个数组包含的对象是不可变的,即使数组是可变的。

结论:简单,了解。


五、- (NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;

该方法的作用就是:根据指定的URL初始化一个数组。

还有几点需要注意:

  • 一个初始化为包含由aURL指定的内容的数组。 如果位置无法打开或位置的内容无法解析为数组,则返回nil。 返回的对象可能与原始接收者不同。
  • 由aURL标识的位置处的数组表示必须只包含属性列表对象(NSString,NSData,NSArray或NSDictionary对象)。 这个数组包含的对象是不可变的,即使数组是可变的。

结论:简单,了解。


六、- (instancetype)initWithObjects:(ObjectType)firstObj, ...;

该方法的作用就是根据参数列表实例化数组。

下面我们看一下参数和返回值:

  • firstObj :数组的第一个对象。
  • ... :以逗号分隔的其他对象列表,以nil结尾。
  • return:一个数组被初始化以包含参数列表中的对象。 返回的对象可能与原始接收者不同。

下面我们看一下代码

- (void)demoInitWithObjects
{
    NSArray *arr = [[NSArray alloc] initWithObjects:[NSDate date], @1, @"hello", nil];
    NSLog(@"arr = %@", arr);
}

下面看输出结果

2017-08-25 00:12:14.301 JJOC[7972:224593] arr = (
    "2017-08-24 16:12:14 +0000",
    1,
    hello
)

结论:简单,了解。


七、- (instancetype)initWithObjects:(ObjectType _Nonnull const *)objects count:(NSUInteger)cnt;

该方法的作用就是:根据给定的C数组实例化一个新的数组。

下面我们看一下代码:

- (void)demoInitWithObjectsCounts
{
    NSString *str[3];
    str[0] = @"0";
    str[1] = @"1";
    str[2] = @"2";
    NSArray *arr = [[NSArray alloc] initWithObjects:str count:2];
    NSLog(@"arr = %@", arr);
}

下面看输出结果

2017-08-25 00:19:00.031 JJOC[8258:230150] arr = (
    0,
    1
)

这里还有几点需要注意:

  • 元素将按照它们在对象中显示的顺序添加到新数组中,直到但不包括索引计数。在以这种方式初始化了一个不可变数组之后,它不能被修改。

结论:简单,了解。

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容