Ios 为什么在尝试将Object添加到NSMutableArray时会得到SIGABRT
我有两门课——bNitem和BNRContainer。BNRContainer是BNRItem的一个子类。为了减少我粘贴的代码量,假设我已经测试并了解以下内容: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
+(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_案例!