Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Iphone NSMutableArray在正确初始化后添加时崩溃_Iphone_Objective C_Nsmutablearray_Nsarray_Type Conversion - Fatal编程技术网

Iphone NSMutableArray在正确初始化后添加时崩溃

Iphone NSMutableArray在正确初始化后添加时崩溃,iphone,objective-c,nsmutablearray,nsarray,type-conversion,Iphone,Objective C,Nsmutablearray,Nsarray,Type Conversion,我将NSMutableArray定义为属性,并进行了合成,还为NSMutableArray分配了一个新创建的实例。但在此之后,每当我尝试向NSMutableArray添加对象时,我的应用程序总是崩溃 第h页 第m页 相关代码 调试器显示,当我使用testPage.questions=[[NSMutableArray alloc]init]时testPage.questions的类型从NSMutableArray*更改为_NSArrayL*(或_NSArrayI*,不确定)。我怀疑这就是问题所在,

我将NSMutableArray定义为属性,并进行了合成,还为NSMutableArray分配了一个新创建的实例。但在此之后,每当我尝试向NSMutableArray添加对象时,我的应用程序总是崩溃

第h页

第m页

相关代码


调试器显示,当我使用
testPage.questions=[[NSMutableArray alloc]init]时testPage.questions的类型从NSMutableArray*更改为_NSArrayL*(或_NSArrayI*,不确定)。我怀疑这就是问题所在,但我觉得非常奇怪。有人知道这里发生了什么吗?

@property(nonatomic,copy)这个setter声明“copy”可能会强制转换到NSArray为什么不保留或分配?无论如何我都会保留

问题是您已将属性声明为
copy
。这意味着您的setter将实现如下内容:

- (void) setQuestions:(NSMutableArray *)array {
  if (array != questions) {
    [questions release];
    questions = [array copy];
  }
}
这里的关键是,如果你
-复制一个数组(无论是不可变的还是可变的),你总是会得到一个不可变的
NSArray

因此,要修复此问题,请将属性更改为
retain
,而不是
copy
,并修复此内存泄漏:

testPage.questions = [[NSMutableArray alloc] init];
应该是:

testPage.questions = [NSMutableArray array];

您还可以创建一个可变复制方法,如下所示:

- (void)setQuestions:(NSMutableArray *)newArray
{
    if (questions != newArray) 
    {
        [questions release];
        questions = [newArray mutableCopy];
    }
}

+1,但新值不会强制转换为
NSArray
。这个方法实际上是在生成一个不可变的副本。谢谢,顺便说一句,有什么方法可以查看从@property这样的指令生成的代码吗?除了查看原始程序集,没有。嗯,我没想到会是这样,但它行得通!我使用了
copy
,因为这里的很多问题都建议在某些内容可变时使用copy。谢谢:D@SpacyRicochet:要确保生成的属性值不可变,请使用
copy
。在
NSString
属性中最常见的就是这种情况:您可以
复制它们,这样字符串本身就不会从您的下面变出来。因为您的属性应该是可变的,所以不能使用
copy
:)非常感谢。这将花费我更长的时间去弄清楚后来也发现了这件事。很好的方法,尽管我将其用于返回我想要更改的普通数组的方法。
testPage.questions = [[NSMutableArray alloc] init];
testPage.questions = [NSMutableArray array];
- (void)setQuestions:(NSMutableArray *)newArray
{
    if (questions != newArray) 
    {
        [questions release];
        questions = [newArray mutableCopy];
    }
}