Objective c 为什么或为什么不使用“调用对象”;“自我”;前缀

Objective c 为什么或为什么不使用“调用对象”;“自我”;前缀,objective-c,Objective C,他们之间有区别吗?为什么我应该使用一个而不是另一个?属性“array”在赋值时声明为retain(@property后面括号中的retain表示这一点)。因为它与“array”实例变量具有相同的名称,所以它使用该实例变量作为其备份存储 有效地调用self.array=[[NSArray alloc]init]与调用array=[[[NSArray alloc]init]retain]相同 当您不使用属性直接分配给实例变量时,不会对其执行任何操作,因此数组只指向NSArray的新实例而不保留它。s

他们之间有区别吗?为什么我应该使用一个而不是另一个?

属性“array”在赋值时声明为retain(@property后面括号中的retain表示这一点)。因为它与“array”实例变量具有相同的名称,所以它使用该实例变量作为其备份存储

有效地调用self.array=[[NSArray alloc]init]与调用
array=[[[NSArray alloc]init]retain]相同


当您不使用属性直接分配给实例变量时,不会对其执行任何操作,因此数组只指向NSArray的新实例而不保留它。

self.array=foo
[self-setArray:foo]
的缩写(即,您访问合成属性方法),而just
array=foo
直接访问实例变量

在这种情况下,您将使用
self.array=[[NSArray alloc]init]创建内存泄漏self.array=[NSArray数组]


选择哪一个几乎是口味的问题,但是使用属性会给您带来一些优势,比如自动键值编码支持。如果有一天您选择自己实现
setArray:
,这样它可以在分配数组时执行其他操作(如重新加载UITableView),这也是一个优势。另一方面,它有点慢,因为它是一个额外的方法调用(只有在循环中多次调用时才重要)。但对于几乎所有的应用程序来说,正确比尽可能快要好。使用属性可以使内存管理更容易。

作为上述的推论,
self.array=[[NSArray alloc]init]
很可能(事实上,几乎可以肯定)发生泄漏;由于您已经拥有正在创建的对象(即
NSArray
),然后您的属性将保留该对象,导致您拥有该对象两次。那么在访问数据时,[self.array objectAtIndex:2]与[array objectAtIndex:2]的可能重复情况如何
@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