繁体   English   中英

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

[英]Why do I get SIGABRT when trying to addObject to NSMutableArray

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

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

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

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

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

rand_container_of_items.subitems = rand_items;

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

问题出在这里

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

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

property(nonatomic, strong) NSMutableArray * subitems;

当你将一个数组分配给可变数组时,这一行给出了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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM