2014-03-05 78 views
1

我有兩個類 - BNRItem和BNRContainer。 BNRContainer是BNRItem的一個子類。爲了減少代碼我貼的數量,假設以下是我已經測試並知道作品:爲什麼我在嘗試將對象添加到NSMutableArray時遇到SIGABRT

+(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; 

如果我NSLog無需添加@「有」,我看到「Hello」在我的描述,所以我知道我可以在那個時候致電addObject:。當我試圖訪問rand_container_of_items的ivar「子項目」時,爲什麼我會得到SIGABRT?我無法弄清楚這一點。

+0

PLZ,沒有更多的snake_case! – Dam

回答

2

問題似乎是您的聲明中的拷貝修飾符。

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

documentation中,NSCopying協議一致性是繼承形式的NSArray,所以我的懷疑的是,在這一行

rand_container_of_items.subitems = rand_items; 

subitems包含原始陣列的不可改變的副本。嘗試從您的聲明中刪除副本。如果您需要複印,請使用mutableCopy方法。

+0

我建議添加[rand_items mutableCopy] – Milo

+0

@MiloGosnell已經做了!不管怎麼說,還是要謝謝你! – Merlevede

+0

謝謝。我現在知道了.. – noobuntu

1

問題就在這裏

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

你不應該使用copy在這裏,因爲它會返回對象的immutable副本。所以你不能添加對象。它可能是

property(nonatomic, strong) NSMutableArray * subitems; 
0

這行給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 
相關問題