簡體   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