为什么或为什么不用“自我”来调用对象。字首?

时间:2010-09-18 20:42:38

标签: objective-c

@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

它们之间有区别吗?为什么我要用一个而不是另一个?

2 个答案:

答案 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的新实例而不保留它。