为NSMutableArray设置属性的适当方法

iHS*_*iHS 1 iphone cocoa cocoa-touch objective-c ios

我想要一个可变数组,并通过一个属性设置它,替换是更好的,请解释原因.我有两个选择

 NSMutableArray *arrSubTitles_temp = [[NSMutableArray alloc] initWithObjects:    
 @"String 1",
 @"String 2",nil];
 self.arrSubTitles = arrSubTitles_temp;
 [arrSubTitles_temp release];
Run Code Online (Sandbox Code Playgroud)

要么

 NSArray *arrSubTitles_temp = [[NSArray alloc] initWithObjects:    
 @"String 1",
 @"String 2",nil];
 self.arrSubTitles = [arrSubTitles_temp mutableCopy];
 [arrSubTitles_temp release];
Run Code Online (Sandbox Code Playgroud)

我猜第一个更好,因为self.arrSubTitles属性保留在.h中,所以(在第二个)mutableCopy方法将提供可变数组,但在这种情况下保留计数将是2.

哪种方法更可取,我应该在设置属性时使用retain.还是仅指定.请建议.

提前谢谢了 :)

Dav*_*ong 6

  1. 使用retain为你的财产属性,除非你有一个很好的理由不(例如:retain会导致保留周期,这是一个原始的,你需要保证的对象是不可改变的,等等)
  2. 使用您发布的第一个示例,因为第二个示例会泄漏内存.

如果您使用assign属性属性,那么第一个选项可能会崩溃:

  1. 分配数组(由您拥有)
  2. 分配给一个房产(仍归您所有)
  3. 发布(没有所有者,及时解除分配)
  4. 尝试访问属性值:崩溃(因为指针是陈旧的)

然而,第二个将起作用:

  1. 分配数组(+1所有者)
  2. 复制数组(原始:+1所有者,复制:+1所有者)
  3. 将副本分配到属性中(两者都有+1所有者)
  4. 释放原始数组(它被取消分配,副本继续存在)

无论如何,拥有一个assign房产然后自己管理价值的保留是相当不寻常的.这非常容易出错,并且将属性声明为更简单,retain并让生成的setter 为您处理release/ retaindance.