我有一个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 *更改为__NSArrayL *(或__NSArrayI *,不确定)。我怀疑这是问题,但我觉得这很奇怪。有人知道这里发生了什么吗?
答案 0 :(得分:4)
问题在于您已将该属性声明为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];
答案 1 :(得分:2)
@property(nonatomic,copy)这个setter声明“copy”可能会转换为NSArray为什么不保留或赋值?无论如何我会保留
答案 2 :(得分:1)
你也可以像这样创建一个可变复制方法:
- (void)setQuestions:(NSMutableArray *)newArray
{
if (questions != newArray)
{
[questions release];
questions = [newArray mutableCopy];
}
}