版本记录
版本号 | 时间 |
---|---|
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
)
这里还有几点需要注意:
- 元素将按照它们在对象中显示的顺序添加到新数组中,直到但不包括索引计数。在以这种方式初始化了一个不可变数组之后,它不能被修改。
结论:简单,了解。
后记
未完,待续~~~