NSMutableArray removeObject崩溃

时间:2014-05-14 12:57:10

标签: ios objective-c

对不起我是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;

}

但它不起作用,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

首先看看你得到的错误。它非常清楚地表明你将“removeObject”发送给了一个不理解它的NSArray,而不是NSMutableArray。合乎逻辑的结论是,在这个时间点,_arr2不是一个可变数组,而是一个NSArray。

现在作为软件开发人员,您应该尝试通过逻辑思考。你知道copy和mutableCopy之间的区别吗?你说你使用了mutableCopy,但是当你设置一个标记为“copy”的属性时你会怎么想?它复制。通过调用副本。因此,您制作了可变nsarray的可变副本,并且属性setter创建了一个不可变的副本。

答案 1 :(得分:2)

我认为你需要使用mutableCopy而不是copy。复制将创建数组的不可变副本。 removeLastObject在Array的可变版本上可用。