对不起我是iOS开发的新手,这一天我遇到了一个奇怪的问题: 当我从自定义对象中删除对象时,它总是返回崩溃:
原因:' - [__ NSArrayI removeLastObject]:无法识别的选择器发送到实例
以下代码:
@interface Base : NSObject
@property (nonatomic, assign) BOOL isFinish;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subTitle;
@property (nonatomic, strong) NSString *tagURL;
@property (nonatomic, assign) NSInteger taskScore;
@property (nonatomic, assign) BOOL inProgress;
@property (nonatomic, assign) NSInteger nowTime;
@property (nonatomic, assign) NSInteger totalTime;
@end
然后我在另一个类上使用:
@property (nonatomic, strong) NSMutableArray *arr1;
@property (nonatomic, copy) NSMutableArray *arr2;
_arr1 = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
Base *b = [[Base alloc] init];
b.title = [[NSString alloc] initWithFormat:@"%d", i];
[_arr1 addObject:b];
}
self.arr2 = [_arr1 copy];// 001, I tried copy or mutable copy
[_arr2 removeLastObject]; //it always crash in here!!
所以我看了一些参考资料,有些人告诉我必须遵守 nscopying 或 nsmutablecopying 协议
所以我在Base类@implementation
中添加了一些方法- (id)copyWithZone:(struct _NSZone *)zone
{
Base *copy = [[[self class] allocWithZone:zone] init];
if (copy) {
[copy setIsFinish:[self isFinished]];
[copy setTitle:[self title]];
[copy setSubTitle:[self subTitle]];
[copy setTagURL:[self tagURL]];
[copy setTaskScore:[self taskScore]];
[copy setInProgress:[self inProgress]];
[copy setNowTime:[self nowTime]];
[copy setTotalTime:[self totalTime]];
}
return copy;
}
但它不起作用,有人可以帮助我吗?
答案 0 :(得分:4)
首先看看你得到的错误。它非常清楚地表明你将“removeObject”发送给了一个不理解它的NSArray,而不是NSMutableArray。合乎逻辑的结论是,在这个时间点,_arr2不是一个可变数组,而是一个NSArray。
现在作为软件开发人员,您应该尝试通过逻辑思考。你知道copy和mutableCopy之间的区别吗?你说你使用了mutableCopy,但是当你设置一个标记为“copy”的属性时你会怎么想?它复制。通过调用副本。因此,您制作了可变nsarray的可变副本,并且属性setter创建了一个不可变的副本。
答案 1 :(得分:2)
我认为你需要使用mutableCopy而不是copy。复制将创建数组的不可变副本。 removeLastObject在Array的可变版本上可用。