繁体   English   中英

不使用自我时使用EXC_BAD_ACCESS

[英]EXC_BAD_ACCESS when not using self

再次被下面的错误所困扰,并且想澄清一下为什么它是一个错误。

我有一个简单的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保留的信息。 我的理解是,它释放了指针在重新分配之前指向的所有内容。 如果我是正确的,那为什么不使用自我。 引起什么问题?

谢谢您的帮助。

****更新

为什么在我检查过的所有示例中,没有self的dealloc方法中的对象释放?

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

如果你不使用self. ,您将直接分配给实例变量myData ,它与myData 属性无关。

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

实例变量只是一个变量,仅此而已。 尽管它可能具有相同的名称,但对其进行分配或读取它就像访问任何变量:除了赋值外,什么都不会保留,释放或以其他方式修改。

的情况下

myData = someDataSource;

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

现在在

self.myData = someDataSource;

someDataSource的值分配给myData 因此, someDataSource myData发生的任何情况都将保留该值。

您也可以执行以下操作:

myData = [someDataSource retain];

希望这可以帮助。

谢谢,

Madhup

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM