【问题标题】:assign NSMutableArray with @property and 'copy' attribute为 NSMutableArray 分配 @property 和 'copy' 属性
【发布时间】:2012-05-30 07:00:24
【问题描述】:

我正在关注一个官方教程 Your second iOS App:Storyboard,它告诉我要像这样声明一个属性 ma​​sterBirdSightingList(只是一个具体的例子,不需要了解上下文):

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

请注意,有一个属性 copy。然后合成这个属性:

@synthesize masterBirdSightingList = _masterBirdSightingList;

接下来是一个让我困惑的初始化方法:

- (void)initializeDefaultDataList {
NSMutableArray *sightingList = [[NSMutableArray alloc] init];
self.masterBirdSightingList = sightingList;
[self addBirdSightingWithName:@"Pigeon" location:@"Everywhere"];
}

肯定会为空间分配SightingList,然后将其分配给masterBirdSightingList 属性。不过,该属性有一个 copy 属性。这意味着实例变量 _masterBirdSightingList 将被分配给另一个空间以保存 sightingList 中的内容。为什么?为什么不直接为这个属性分配空间:

self.masterBirdSightingList = [[NSMutableArray alloc] init];

【问题讨论】:

  • 我想知道语句 self.masterBirdSightingList =SightingList 只是一个简单的复制操作,它只复制引用或者它会分配一个新的空间来存储内容?谢谢
  • 值得关注的事情:通常,“可变”对象的 -copy 方法将返回非可变变体(在您的情况下为 NSArray)。为了防止异常,你必须自己编写setter方法来调用-mutableCopy。

标签: objective-c ios


【解决方案1】:

在 Objective-C 中,属性中的 copy 属性意味着合成的 setter 将如下所示:

-(void)setMasterBirdSightingList:(NSMutableArray*)newValue
{
    if (_masterBirdSightingList == newValue) return;
//  NSMutableArray* oldValue = _masterBirdSightingList;
    _masterBirdSightingList = [newValue copy];
//  [oldValue release];    // <-- not applicable in ARC.
}

并且点语法总是会被翻译成

[self setMasterBirdSightingList:sightingList];

无论属性的属性如何。

通过-copy 方法完成“分配给另一个空间以保存来自sightingList 的东西”的东西。将参数传递给 setter 的 newValue 参数的方式无关紧要。


编辑:正如评论中提到的@David,可变类型的-copy 方法返回一个不可变对象。您必须重写 setter 来调用 -mutableCopy。见What's the best way to use Obj-C 2.0 Properties with mutable objects, such as NSMutableArray?

【讨论】:

  • 我希望与isEqual:比较。
  • @HotLicks:不,它们不应该与-isEqual: 进行比较。 == 的存在主要是为了避免在-copy 返回相同的值(可能是不可变类型)并且您正在使用self.foo = self.foo 时避免双重释放。
  • 我查看了教程,其中确实包含有关覆盖设置器以保持可变性的说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2011-02-22
  • 2021-05-12
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多