代码之家  ›  专栏  ›  技术社区  ›  chris

当不使用self时,EXC\u BAD\u ACCESS

  •  0
  • chris  · 技术社区  · 16 年前

    我被下面的虫子抓住了 再一次 我想澄清一下为什么它是一个bug。

    // 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\u BAD\u访问错误。

    我是否遗漏了一些关于@property retain的信息。我的理解是,它释放指针在重新分配之前指向的任何内容。如果我是正确的,那么为什么不使用自我呢。有什么问题吗?

    ****更新

    - (void) dealloc { 
      [someArray release]; 
      [someTableView release];
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Grant Paul    16 年前

    如果你不使用 self. ,则直接分配给实例变量 myData ,这与 我的数据

    self.myData 只是语法上的糖 [self myData] 或 [self setMyData:newValue] -myData 和 -setMyData:

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

        2
  •  1
  •   Madhup Singh Yadav    16 年前

    万一

    myData = someDataSource;
    

    你给的是 someDataSource (局部变量或有限范围变量)到 myData someDataSource公司 当您将其引用传递给 我的数据

    现在的情况是

    self.myData = someDataSource;
    

    someDataSource公司 分配给 . 所以不管发生什么 我的数据 将保留该值。

    你也可以这样做:

    myData = [someDataSource retain];
    

    谢谢,

    马杜普

    推荐文章