使用initWithObjects:导致崩溃,但initWithCapacity:后跟addObject:不会

时间:2011-12-13 03:02:40

标签: objective-c ios nsarray exc-bad-access storyboard

一个非常奇怪的问题。我必须在- (void)viewDidLoad中初始化一个数组。

数组prjMemberArray被声明为属性:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

如果我使用这个

prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone",@"someone",@"someone" ,nil];

release中调用viewDidUnload

然后当视图加载时,它会立即崩溃但是当我使用它时:

prjMemberArray = [[NSMutableArray alloc] initWithCapacity:0];

[prjMemberArray addObject:@"someone"];

效果很好。有谁能解释一下?我使用故事板来呈现当前的视图控制器,如下所示:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];  
prj_Detail = [sb instantiateViewControllerWithIdentifier:@"ProjectDetailVC"]; 

[self presentModalViewController:prj_Detail animated:YES];

prjMemberArray属于prj_Detail的属性。

2 个答案:

答案 0 :(得分:1)

您确定没有拼写错误的内容并且已写入,例如在崩溃的场景中"someone"而不是@"someone"

答案 1 :(得分:0)

引用属性时不要忘记使用 self 。这是一种安全的方式来声明,而不必担心泄漏:

部首:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

实现:

@synthesize prjMemberArray=_prjMemberArray;

- (void) viewDidLoad {

    [super viewDidLoad];

    NSMutableArray *prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone", @"someone", @"someone" ,nil];

    self.prjMemberArray = prjMemberArray;

    [prjMemberArray release];
}

- (void) dealloc {

    [_prjMemberArray release];

    [super dealloc];
}

@property为您的变量创建getter和setter,但通常会对变量本身感到困惑。当他们发布XCode4时,我相信他们添加了通过执行以下操作来设置您希望实例变量命名的功能:

@synthesize prjMemberArray=_prjMemberArray;

在XCode4之前,您只需执行以下操作:

@synthesize prjMemberArray;

所以@property在幕后做的事情有点像这样:

-(NSMutableArray*) prjMemberArray {
    return _prjMemberArray;
}

-(void) setPrjMemberArray:(NSMutableArray *) val {
    if( _prjMemberArray != nil )
        [prjMemberArray release];

    _prjMemberArray = [val retain];
}

因此,不要将@property视为变量本身,并记住在引用它们时始终使用 self 。这应该可以为你节省很多痛苦和一些内存泄漏。