不使用self时EXC_BAD_ACCESS

时间:2010-03-25 04:59:14

标签: iphone crash

我再次被以下的错误所吸引并希望澄清为什么它是一个错误。

我有一个简单的UITableView加载一些数据:

// myclass.h
@property (nonatomic, retain) NSArray *myData

// myclass.m
@synthesize myData;

- (void) viewDidLoad {
  ...
  myData = someDataSource // note the lack of self
}

- (UITableViewCell *) cellForRowAtIndexPath ... {
   ...
   cell.textLabel.text = [self.myData objectAtIndex:indexPath.row];  // EXC_BAD_ACCESS
}

该表首先加载正常,但当滚动向上足够其中一个单元格完全在视图之外时,我会得到EXC_BAD_ACCESS错误。

我错过了关于@property retain的内容。我的理解是它会在重新分配之前释放指针先前指向的任何内容。如果我是正确的那么为什么不使用自我。引起任何问题?

感谢您的帮助。

****更新

为什么在我所检查的所有示例中都没有使用self来检查dealloc方法中的对象的释放?

- (void) dealloc { 
  [someArray release]; 
  [someTableView release];
}

2 个答案:

答案 0 :(得分:1)

如果您不使用self.,则直接指定实例变量myData,该变量与属性 myData无关。

self.myData只是[self myData][self setMyData:newValue]的语法糖,而合成的属性只会创建-myData-setMyData:方法。

实例变量只是一个变量,仅此而已。虽然它可能具有相同的名称,分配给它或从中读取它就像访问任何变量一样:除了赋值之外,没有任何内容被保留,发布或以其他方式修改。

答案 1 :(得分:1)

如果是

myData = someDataSource;

您将someDataSource(局部变量或有限范围变量)的引用提供给myData。现在,只要someDataSource超出范围,它就会被释放,并且当您将其引用传递给myData时,它也会被释放。

现在是

的情况
self.myData = someDataSource;

someDataSource的值已分配给myData。因此,无论someDataSource myData发生什么,都会保留该值。

你也可以这样做:

myData = [someDataSource retain];

希望这有帮助。

谢谢,

Madhup