簡體   English   中英

為什么(復制,非原子)NSMutableArray屬性創建NSArrays?

[英]Why does a (copy, nonatomic) NSMutableArray property create NSArrays?

我在創建一個TableView class犯了一個錯誤,並且在我定義它時意外地將我的@property保留為copy

@property (copy, nonatomic) NSMutableArray *words; 

我正確地初始化了數組:(注意這是第三次嘗試,所以請忽略我不使用mutableCopy和其他更好的方法這樣做的事實)

NSArray *fixedWords = @[@"Eeny", @"Meeny", @"Miny", @"Moe", @"Catch", @"A", @"Tiger", @"By", @"His", @"Toe"];
NSMutableArray *mutWords = [[NSMutableArray alloc] initWithArray:fixedWords];
self.words = mutWords;

但是當我后來重新排序數組時,它在removeObjectAtIndex行崩潰:

id object = [self.words objectAtIndex:fromIndexPath.row];
NSUInteger from = fromIndexPath.row;
NSUInteger to = toIndexPath.row;
[self.words removeObjectAtIndex:from];

帶有錯誤消息

unrecognized selector sent to instance

進行了大量的挖掘,以確定這是因為復制意味着分配NSMutableArray會導致創建標准(不可變)NSArray。 任何人都可以解釋為什么這是正確的行為?

-copy,由可變的Cocoa類實現,總是返回它們的不可變對應物 因此,當發送NSMutableArray -copy時,它返回包含相同對象的NSArray。

因為words具有內存限定符copy ,所以此行:

NSMutableArray *mutWords = [[NSMutableArray alloc] initWithArray:fixedWords];
self.words = mutWords;

擴展到:

NSMutableArray *mutWords = [[NSMutableArray alloc] initWithArray:fixedWords];
self.words = [mutWords copy];

鑒於NSMutableArray是NSArray的子​​類,編譯器不會抱怨,你現在有一個滴答作響的定時炸彈,因為NSArray不識別它的可變子類'方法(因為它不能改變它的內容)。

屬性並不神奇,它們只是簡寫。 在對象上聲明@property告訴編譯器為它創建一個支持實例變量和訪問器方法。 實際生成的代碼取決於您在屬性上設置的屬性。

重要的是要記住,使用點語法設置屬性也是簡寫。 你打電話時…

self.words = mutWords;

...你實際上是在幕后調用生成的訪問器方法,如下所示:

[self setWords:mutWords];

由於您在屬性上指定了copy屬性,因此您已告訴編譯器生成-setWords: accessor方法,其代碼如下所示:

- (void)setWords:(NSMutableArray *)words
{
    _words = [words copy];
}

了解所有這些,您可以看到發生了什么:生成的setter方法將在輸入參數上調用-copy ,並將結果分配給后備實例變量。 因為-copy方法總是被實現為返回一個不可變的對象(執行[aMutableString copy]將返回一個NSString,依此類推)設置該屬性將始終存儲一個不可變的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM