关于保留计数的问题&初始化成员变量

时间:2011-02-11 18:01:13

标签: objective-c

想象一下,我有一个成员变量

@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?

初始化成员变量的惯例是什么?

1 个答案:

答案 0 :(得分:3)

这是正确的,self.array =的保留计数最终为2。

首先,您alloc init新的NSArray对象。这是保留计数1.其次,您的setter在将对象分配给您的实例var时向对象发送retain消息。这会使保留计数增加到2。

  

初始化成员变量的惯例是什么?

除了在问题中直接设置ivar array =之外,以下是一些使用self.array属性执行此操作而无泄漏的方法:

  1. 自动释放:

    self.array = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
    
  2. 使用arrayWithObjects:类方法。更简单,并且还生成一个自动释放的对象:

    self.array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil];
    
  3. 创建一个临时变量来保存新指针,然后在设置属性后将其释放(之后将保留该属性):

    NSArray *tmpArray = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil];
    self.array = tmpArray;
    [tmpArray release];