Ios 为什么在尝试将Object添加到NSMutableArray时会得到SIGABRT

Ios 为什么在尝试将Object添加到NSMutableArray时会得到SIGABRT,ios,objective-c,sigabrt,Ios,Objective C,Sigabrt,我有两门课——bNitem和BNRContainer。BNRContainer是BNRItem的一个子类。为了减少我粘贴的代码量,假设我已经测试并了解以下内容: +(BNRItem * ) randomItem; // allocate and init a random item. @property(nonatomic, readwrite, copy) NSMutableArray * subitems; // This is a property of BNRContainer cla

我有两门课——bNitem和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;
+(bNitem*)随机项;//分配并初始化一个随机项。
@属性(非原子、读写、复制)NSMutableArray*子项;//这是BNRContainer类的属性
main.m:
NSMutableArray*rand_items=[NSMutableArray alloc]init];
对于(int i=0;i<10;i++){
[rand_items addObject:[bNitem randomItem]];
}
[rand_items addObject:@“HELLO”];
BNRContainer*rand_container_of_items=[BNRContainer random item];
rand_容器_of_items.subitems=rand_items;
[rand_container_of_items.subitems addObject:@“THERE”];//错误信号
NSLog(@“-----------------------------------------------------------------------”;
NSLog(@“%@”,随机容器中的物品);
rand_容器_of_项目=零;

如果我
NSLog
没有添加@“THERE”,我会在我的描述中看到“HELLO”,因此我知道我可以在此时调用
addObject:
。当我试图访问rand_容器的ivar“子项”时,为什么会得到SIGABRT?我就是想不出这个问题。

问题似乎在于声明中的复制修饰符

@property (nonatomic, readwrite, copy) NSMutableArray *subitems;
在中,NSCopying协议一致性是从NSArray继承的,因此我怀疑在这一行中

rand_container_of_items.subitems = rand_items;
子项
包含原始数组的不可变副本。尝试从声明中删除副本。如果需要副本,请使用
mutableCopy
方法。

问题就在这里

property(nonatomic, readwrite, copy) NSMutableArray * subitems;
您不应该在此处使用
copy
,因为它将返回对象的
不可变副本。这样您就无法向其中添加对象。可能是

property(nonatomic, strong) NSMutableArray * subitems;

这一行给出了sigbart,因为当您将一个数组分配给可变数组时,它变为可变的

因此,当您将rand_项复制到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

我建议添加[rand_items mutableCopy]plz,不再添加snake_案例!