我再次被以下的错误所吸引并希望澄清为什么它是一个错误。
我有一个简单的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];
}
答案 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