@interface{
NSArray *array;
}
@property (nonatomic, retain) NSArray *array;
@end
@implementation
@synthesize array;
self.array = [[NSArray alloc] init];
array = [[NSArray alloc] init];
[self.array objectAtIndex:2]; [array objectAtIndex:2];
@end
它们之间有区别吗?为什么我要用一个而不是另一个?
答案 0 :(得分:4)
self.array = foo
是[self setArray:foo]
的简写(即您访问合成属性方法),而array = foo
只是直接访问实例变量。
在这种情况下,您将使用self.array = [[NSArray alloc] init];
创建内存泄漏,因为该属性将保留它,因此引用计数将为2而不是1.因此更好的是:self.array = [NSArray array];
。< / p>
首选哪一个几乎是品味问题,但使用这些属性可以为您提供一些优势,例如自动键值编码支持。如果你有一天选择自己实现setArray:
,那么它也是一个优点,因此它可以在分配数组时执行其他操作(比如重新加载UITableView)。另一方面,它有点慢,因为它是一个额外的方法调用(只有在循环中调用很多时才有意义)。但对于几乎所有的应用程序来说,最好是正确而不是尽可能快。使用属性可以使您更容易进行内存管理。
答案 1 :(得分:3)
声明属性“array”在赋值时保留(@property表示括号后保留在括号中)。因为它与“array”实例变量具有相同的名称,所以它使用该实例变量作为它的后备存储。
有效呼叫self.array = [[NSArray alloc] init];
与呼叫array = [[[NSArray alloc] init] retain];
直接分配给实例变量时,不使用该属性,不对其执行任何操作,因此数组只是指向NSArray的新实例而不保留它。