为什么在尝试将addObject添加到NSMutableArray时会收到SIGABRT

时间:2014-03-05 05:53:10

标签: ios objective-c sigabrt

我有两个类--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;

如果我NSLog没有添加@“THERE”,我会在说明中看到“HELLO”,所以我知道我可以在那时拨打addObject:。当我尝试访问rand_container_of_items的ivar“subitems”时,为什么我会收到SIGABRT?我只是想不出这个。

3 个答案:

答案 0 :(得分:2)

问题似乎是声明中的复制修饰符。

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

documentation中,NSCopying协议一致性是从NSArray继承的,所以我怀疑是在这一行

rand_container_of_items.subitems = rand_items;

subitems包含原始数组的不可变副本。尝试从声明中删除复制。如果您需要副本,请使用mutableCopy方法。

答案 1 :(得分:1)

问题出在这里

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

您不应在此处使用copy,因为它将返回对象的immutable副本。这样你就无法向它添加对象。它可能是

property(nonatomic, strong) NSMutableArray * subitems;

答案 2 :(得分: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