繁体   English   中英

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

[英]NSMutableArray crashes when adding after proper initialization

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

Page.h

@interface Page : NSObject  
{  
    NSString *name;  
    UIImage *image;  
    NSMutableArray *questions;  
}
@property (nonatomic, copy) NSString *name;  
@property (nonatomic, retain) UIImage *image;  
@property (nonatomic, copy) NSMutableArray *questions;  
@end

Page.m

@implementation Page  
@synthesize name, image, questions;  
@end  

相关代码

Page *testPage = [[Page alloc] init];  
testPage.image = [UIImage imageNamed:@"Cooperatief  leren Veenman-11.jpg"];  
testPage.name = [NSString stringWithString:@"Cooperatief  leren Veenman-11.jpg"];  
testPage.questions = [[NSMutableArray alloc] init];  
[testPage.questions addObject:[NSNumber numberWithFloat:arc4random()]];  

调试器显示我使用testPage.questions = [[NSMutableArray alloc] init];的那一刻testPage.questions = [[NSMutableArray alloc] init]; testPage.questions的类型从NSMutableArray *更改为__NSArrayL *(或__NSArrayI *,不确定)。 我怀疑这是问题,但我觉得这很奇怪。 有谁知道这里发生了什么?

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

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

这里的踢球者是,如果你-copy一个数组(无论是不可变的还是可变的),你将永远得到一个不可变的NSArray

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

testPage.questions = [[NSMutableArray alloc] init];

它应该是:

testPage.questions = [NSMutableArray array];

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM