想象一下,我有一个成员变量
@property(nonatomic,retain)NSArray *array;
现在在我的viewDidLoad中我设置了一个简单的数组
array = [[NSArray alloc]initWithObjects:@"A",@"B","C",nil];
我对数组的保留计数是1对吗?
现在,如果我使用访问器方法设置数组
self.array = [[NSArray alloc]initWithObjects:@"A",@"B","C",nil];
我的保留计数是2,因为我的存取方法会使保留计数增加1?
初始化成员变量的惯例是什么?
答案 0 :(得分:3)
这是正确的,self.array =
的保留计数最终为2。
首先,您alloc init
新的NSArray
对象。这是保留计数1.其次,您的setter在将对象分配给您的实例var时向对象发送retain
消息。这会使保留计数增加到2。
初始化成员变量的惯例是什么?
除了在问题中直接设置ivar array =
之外,以下是一些使用self.array
属性执行此操作而无泄漏的方法:
自动释放:
self.array = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
使用arrayWithObjects:
类方法。更简单,并且还生成一个自动释放的对象:
self.array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil];
创建一个临时变量来保存新指针,然后在设置属性后将其释放(之后将保留该属性):
NSArray *tmpArray = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil];
self.array = tmpArray;
[tmpArray release];