簡體   English   中英

為什么在嘗試將addObject添加到NSMutableArray時會收到SIGABRT

[英]Why do I get SIGABRT when trying to addObject to NSMutableArray

我有兩個類--BNRItem和BNRContainer。 BNRContainer是BNRItem的子類。 為了減少我粘貼的代碼量,假設我已經測試並知道以下工作:

+(BNRItem * ) randomItem; // allocate and init a random item.

@property(nonatomic, readwrite, copy) NSMutableArray * subitems; // This is a property of BNRContainer class

main.m:

NSMutableArray * rand_items = [NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
    [rand_items addObject: [BNRItem randomItem]];
}

[rand_items addObject: @"HELLO"];

BNRContainer * rand_container_of_items = [BNRContainer randomItem];
rand_container_of_items.subitems = rand_items;

[rand_container_of_items.subitems addObject: @"THERE"]; // ERROR SIGABRT

NSLog(@"------------------------------------------------------");
NSLog(@"%@", rand_container_of_items);

rand_container_of_items = nil;

如果我沒有添加@“THERE”的NSLog ,我在我的描述中看到“HELLO”所以我知道我能夠在那時調用addObject: 當我嘗試訪問rand_container_of_items的ivar“subitems”時,為什么我會收到SIGABRT? 我只是想不出這個。

問題似乎是聲明中的復制修飾符。

@property (nonatomic, readwrite, copy) NSMutableArray *subitems;

文檔中 ,NSCopying協議一致性是從NSArray繼承的,所以我懷疑是在這一行

rand_container_of_items.subitems = rand_items;

subitems包含原始數組的不可變副本。 嘗試從聲明中刪除副本 如果需要副本,請使用mutableCopy方法。

問題出在這里

property(nonatomic, readwrite, copy) NSMutableArray * subitems;

你不應該在這里使用copy ,因為它將返回對象的immutable副本。 這樣你就無法向它添加對象。 它可能是

property(nonatomic, strong) NSMutableArray * subitems;

當你將一個數組分配給可變數組時,這一行給出了sigbart,它變得可變。

因此,當您將rand_items復制到rand_container_of_items.subitem時,它變得可變。

因此,要使其不可變,請嘗試以下操作:

BNRContainer * rand_container_of_items = [BNRContainer randomItem];
rand_container_of_items.subitems = [rand_items mutablecopy];

[rand_container_of_items.subitems addObject:@"THERE"]; // ERROR SIGABRT

暫無
暫無

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

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