为啥设置类变量 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 需要我使用访问器方法?的主要内容,如果未能解决你的问题,请参考以下文章