![](/img/trans.png)
[英]How to make a deep copy of an NSMutableArray property of a Custom Object
[英]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.