如果我尝试在tempSeedsArray
之后发布seedsArray = tempSeedsArray
,我会收到EXEC_BAD_ACCESS
,而且乐器会显示tempSeedsArray
已被释放两次。这是我的viewWillAppear
方法:
- (void)viewWillAppear:(BOOL)animated {
NSString *arrayFilePath = [[NSBundle mainBundle] pathForResource:@"SeedsArray" ofType:@"plist"];
NSLog(@"HIT!");
NSMutableArray *tempSeedsArray = [[NSMutableArray alloc] initWithContentsOfFile:arrayFilePath];
seedsArray = tempSeedsArray;
NSLog(@"%u", [seedsArray retainCount]);
[seedsArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
[super viewWillAppear:animated];
}
seedsArray
是一个NSMutableArray,设置为nonatomic
和retain
属性,并且是合成的。
但是,如果我将seedsArray = tempSeedsArray
更改为self.seedsArray = tempSeedsArray
(或[self seedsArray] = tempSeedsArray
等),我可以发布tempSeedsArray
。有人可以简单地向我解释为什么会这样,因为我很困惑!
由于
答案 0 :(得分:2)
seedsArray = ...
分配到seedsArray
字段。self.seedsArray = ...
调用setSeedsArray:
,这是seedsArray
属性的设置者。如果你@synthesize seedsArray
,这两个表单的行为几乎相同(参见下面的@ JeremyP评论),但是如果你定义了自己的setter,只有第二个表单会设置属性并调用你的代码。