Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSMutableArray removeObject崩溃_Ios_Objective C - Fatal编程技术网

Ios NSMutableArray removeObject崩溃

Ios NSMutableArray removeObject崩溃,ios,objective-c,Ios,Objective C,很抱歉,我是iOS开发新手,这一天我遇到了一个奇怪的问题: 从自定义对象中删除对象时,它总是返回崩溃: 原因:'-[\uuu NSArrayI removeLastObject]:无法识别的选择器发送到实例 以下代码: @interface Base : NSObject @property (nonatomic, assign) BOOL isFinish; @property (nonatomic, strong) NSString *title; @property (nonatomic

很抱歉,我是iOS开发新手,这一天我遇到了一个奇怪的问题: 从自定义对象中删除对象时,它总是返回崩溃:

原因:'-[\uuu 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!!

但是它不起作用,有人能帮我吗?

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


现在作为一名软件开发人员,您应该试着从逻辑上考虑这一点。你知道复制和可变复制的区别,对吗?您说您使用了mutableCopy,但是当您设置一个标记为“copy”的属性时,您认为会发生什么?它复制。通过呼叫copy。因此,您创建了可变nsarray的可变副本,而属性设置程序创建了一个不可变副本

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


现在作为一名软件开发人员,您应该试着从逻辑上考虑这一点。你知道复制和可变复制的区别,对吗?您说您使用了mutableCopy,但是当您设置一个标记为“copy”的属性时,您认为会发生什么?它复制。通过呼叫copy。因此,您创建了可变nsarray的可变副本,而属性设置程序创建了一个不可变副本

我认为您需要使用mutableCopy而不是copy。Copy将创建数组的不可变副本。RemovelAsObject在阵列的可变版本上可用。

我认为您需要使用可变副本而不是副本。Copy将创建数组的不可变副本。removeLastObject在数组的可变版本上可用。

如果您(OP)想知道如何解决问题,您可以更改“@property(nonatomic,copy)NSMutableArray*arr2;”到“@property(非原子,强)NSMutableArray*arr2;”,例如。纳舍尔的解释是正确的。。。。并返回到使用可变副本
self.arr2=[\u arr1 mutableCopy]谢谢,我知道了。但我想知道为什么苹果不设置mutableCopy属性。这是不是说当你制作一个不可变的深度拷贝时,最好使用copy属性?如果你(OP)想知道如何解决你的问题,你可以更改'@property(nonatomic,copy)NSMutableArray*arr2;'到“@property(非原子,强)NSMutableArray*arr2;”,例如。纳舍尔的解释是正确的。。。。并返回到使用可变副本
self.arr2=[\u arr1 mutableCopy]谢谢,我知道了。但我想知道为什么苹果不设置mutableCopy属性。这是不是说在制作不可变的深度拷贝时,最好使用copy属性?mutablecopyWithZone的最佳实践实现是什么
- (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;

}