【问题标题】:EXC_BAD_ACCESS when not using self不使用自我时的 EXC_BAD_ACCESS
【发布时间】:2010-03-25 04:59:14
【问题描述】:

我再次被以下错误所抓住,我想澄清一下为什么它是一个错误。

我有一个加载一些数据的简单 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.有什么问题吗?

感谢您的帮助。

**** 更新

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

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

【问题讨论】:

    标签: iphone crash


    【解决方案1】:

    如果不使用self.,则直接赋值给实例变量myData,与属性myData无关。

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

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

    【讨论】:

    • 我意识到它们是方法,但它们不只是 myData 变量的包装器吗?我想问题是为什么 myData = ... 会迷路?
    • @chris,你必须调用 retain 的方法才能发生 - 你正在结束系统运行,因为那里没有 self.
    • 不是真的,卡尔。他们没有包装它,他们正在为它指定一个接口。而那个接口恰好保留和释放你给它的东西。但是分配给变量没有。可以这样想:变量在 C 中,因此赋值的工作方式与在 C 中一样,仅此而已。但是消息不是,因此它们可以做的比 C 中的更多。
    • @carl,就像你说的,如果我使用 myData = ...; [myData 保留];它也有效。我想我感到困惑的是为什么第一次绑定 tableView 时一切运行良好。
    • self... 从 dealloc 中丢失,因为无法保证在 dealloc 函数中此时访问器方法仍然可用。
    【解决方案2】:

    如果发生

    myData = someDataSource;
    

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

    现在是

    self.myData = someDataSource;
    

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

    你也可以这样做:

    myData = [someDataSource retain];
    

    希望这会有所帮助。

    谢谢,

    马杜普

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多