Iphone NSMutableArray在正确初始化后添加时崩溃
我将NSMutableArray定义为属性,并进行了合成,还为NSMutableArray分配了一个新创建的实例。但在此之后,每当我尝试向NSMutableArray添加对象时,我的应用程序总是崩溃 第h页 第m页 相关代码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*,不确定)。我怀疑这就是问题所在,
调试器显示,当我使用
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];
}
}