【问题标题】:Question About Retain Counts & initializing member variables关于保留计数和初始化成员变量的问题
【发布时间】:2011-06-25 17:43:21
【问题描述】:

假设我有一个成员变量

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

初始化成员变量的约定是什么?

【问题讨论】:

  • 这是一个属性,不是成员变量。它们是两种截然不同的东西。
  • 还要注意,Objective-C 没有成员变量。它有实例变量。 (或多或少相同,但使用正确的术语会有所帮助。)
  • 我不清楚区别。需要详细说明吗?

标签: objective-c


【解决方案1】:

没错,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];
    

【讨论】:

  • 如何使用第一个选项 array = [[NSArray alloc]initWithObjects:....];这似乎是最简单的,你为什么不推荐那个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2012-08-23
  • 1970-01-01
  • 2014-09-08
  • 2020-09-20
相关资源
最近更新 更多