为啥设置类变量 NSArray 需要我使用访问器方法?

Posted

技术标签:

【中文标题】为啥设置类变量 NSArray 需要我使用访问器方法?【英文标题】:Why does setting the class variable NSArray require me to use the accessor method?为什么设置类变量 NSArray 需要我使用访问器方法? 【发布时间】:2011-02-07 17:08:21 【问题描述】:

我正在使用 NSFetchRequest 根据存储在 Core Data 中的对象在 UITableView 中创建一个部分。

在 viewDidLoad 中,我执行获取请求并将返回的 NSManagedObjects 数组设置为类变量 NSArray *allEvents。我正在设置从获取请求返回的数组,如下所示:

    allEvents = [context executeFetchRequest:eventFetchRequest error:&error];

稍后我尝试在我的 numberOfRowsInSection 中调用 [allEvents count] 时遇到 EXEC_BAD_ACCESS 错误。

我设法通过将 self 添加到上述代码行来设置获取请求中的数组来解决问题:

    self.allEvents = [context executeFetchRequest:eventFetchRequest error:&error];

谁能解释一下为什么会这样?我遇到过类似的情况,很想知道发生了什么。

谢谢。

【问题讨论】:

【参考方案1】:

您对象上的“allEvents”属性很可能是一个保留属性,因此在第一种情况下,该数组不会被保留,并且在您访问它时已被释放。

【讨论】:

这是一个保留属性。那么这是否意味着当我调用访问器方法时,它的保留计数会增加? 一种更好的思考方式是保留属性“拥有”与它们一起设置的当前对象,并在设置新对象时放弃所有权。这样做的机制是它们增加和减少保留计数,是的。合成方法看起来像: - (void) setFoo:(id)newFoo if (foo != newFoo) [foo release]; foo = [newFoo 保留];

以上是关于为啥设置类变量 NSArray 需要我使用访问器方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的函数不能访问它所在类的私有变量 INSIDE?

为啥我不能从其他类访问公共变量?

为啥 C# 公共静态变量不需要实例化?

为啥我不能在 uitableview 单元格中放置一个 nsarray

为啥需要保留 NSString 变量?

为啥在 JSP 中需要 pageContext?