Objective c 为什么或为什么不使用“调用对象”;“自我”;前缀
他们之间有区别吗?为什么我应该使用一个而不是另一个?属性“array”在赋值时声明为retain(@property后面括号中的retain表示这一点)。因为它与“array”实例变量具有相同的名称,所以它使用该实例变量作为其备份存储 有效地调用self.array=[[NSArray alloc]init]与调用Objective c 为什么或为什么不使用“调用对象”;“自我”;前缀,objective-c,Objective C,他们之间有区别吗?为什么我应该使用一个而不是另一个?属性“array”在赋值时声明为retain(@property后面括号中的retain表示这一点)。因为它与“array”实例变量具有相同的名称,所以它使用该实例变量作为其备份存储 有效地调用self.array=[[NSArray alloc]init]与调用array=[[[NSArray alloc]init]retain]相同 当您不使用属性直接分配给实例变量时,不会对其执行任何操作,因此数组只指向NSArray的新实例而不保留它。s
array=[[[NSArray alloc]init]retain]相同代码>
当您不使用属性直接分配给实例变量时,不会对其执行任何操作,因此数组只指向NSArray的新实例而不保留它。self.array=foo
是[self-setArray:foo]
的缩写(即,您访问合成属性方法),而justarray=foo
直接访问实例变量
在这种情况下,您将使用self.array=[[NSArray alloc]init]创建内存泄漏因为属性将保留它,因此引用计数将是2而不是1。所以最好是: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