繁体   English   中英

使用@property和'copy'属性分配NSMutableArray

[英]assign NSMutableArray with @property and 'copy' attribute

我正在关注官方教程你的第二个iOS应用程序:Storyboard ,它告诉我像这样声明一个属性masterBirdSightingList (只是一个特定的例子,不需要知道上下文):

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

请注意,有一个属性副本 然后合成这个属性:

@synthesize masterBirdSightingList = _masterBirdSightingList;

接下来有一个让我困惑的init方法:

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

绝对是为空格分配了sightingList,然后将它分配给masterBirdSightingList属性。 但是,该属性具有复制属性。 这意味着实例变量_masterBirdSightingList将为另一个空间,从sightingList保存的东西进行分配。 为什么? 为什么不直接为属性分配空间,如下所示:

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

在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];

无论属性的属性如何。

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


编辑 :正如注释中提到的@David一样 ,可变类型的-copy方法返回一个不可变对象。 您必须覆盖setter才能调用-mutableCopy 请参阅使用可变对象的Obj-C 2.0属性的最佳方法是什么,例如NSMutableArray?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM