我有两个类--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?我只是想不出这个。
答案 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