这两个不同的Objective-C线有什么区别,为什么一个工作而不是另一个?

时间:2010-04-12 10:13:29

标签: objective-c iphone memory-management nsmutablearray nsarray

如果我尝试在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,设置为nonatomicretain属性,并且是合成的。

但是,如果我将seedsArray = tempSeedsArray更改为self.seedsArray = tempSeedsArray(或[self seedsArray] = tempSeedsArray等),我可以发布tempSeedsArray。有人可以简单地向我解释为什么会这样,因为我很困惑!

由于

1 个答案:

答案 0 :(得分:2)

  1. seedsArray = ...分配到seedsArray 字段
  2. self.seedsArray = ...调用setSeedsArray:,这是seedsArray 属性的设置者。
  3. 如果你@synthesize seedsArray,这两个表单的行为几乎相同(参见下面的@ JeremyP评论),但是如果你定义了自己的setter,只有第二个表单会设置属性并调用你的代码。