集合类一般都有两个版本:可变类型和不可变类型。其中不可变类型是完全线程安全的,而可变类型不能保证这一点。所以在API接口中,不应该返回可变类型的集合参数。有时候更有效的做法是:在程序内部保持一个可变类型的集合类对象,而返回一个复制的,不可变类型的集合类对象以供外部访问。
如数组NSArray与NSMutableArray。
数组实例化的方法即有-方法,也有+方法。
// -方法实例化
NSMutableArray *array11 = [[NSMutableArray alloc] init];
NSMutableArray *array12 = [[NSMutableArray alloc] initWithCapacity:1];
NSMutableArray *array13 = [[NSMutableArray alloc] initWithObjects:@"1", nil];
NSMutableArray *array14 = [[NSMutableArray alloc] initWithArray:array13];
// +方法实例化
NSMutableArray *array21 = [NSMutableArray array];
NSMutableArray *array22 = [NSMutableArray arrayWithCapacity:1];
NSMutableArray *array23 = [NSMutableArray arrayWithObjects:@"1", nil];
NSMutableArray *array24 = [NSMutableArray arrayWithArray:array23];
不同的实例化方法都是根据其内存管理机制来定义的。
首先使用-方法,即alloc和copy都会分配内存,需要手动release。
而使用+方法,也会分配内存,不过系统会来管理这块内存,不需要手动release,即被设置为autorelease,被加入自动释放池autorelease pool。
在当前开发中的内存管理机制因为有了ARC,所以少了内存管理的不少烦心事。因为ARC是自动在合适的位置帮你添加release代码之类的。但是,还是有点区别的。ARC可能在大多数时候比autorelease pool更高效一些。