2

在我的 .h 文件中,我定义了一个 NSMutableArray *locationsArray,其属性如下

@property (nonatomic, retain) NSMutableArray *locationsArray

在我的 .m 文件中,我正在显示一个表格视图,它加载得很好,直到我尝试汇总时它因访问错误而崩溃。这是由于未保留位置数组。

这行代码解决了我在 .m 中的问题

locationsArray = [[Locations loadLocations] retain] (#1)

这行代码也解决了同样的问题

self.locationsArray = Locations.loadLocations (#2)

我有几个问题需要澄清

  1. 这是设置此值的正确方法吗,我应该这样做alloc initalloc initwithArray
  2. 来自我理解的java世界self是这样的,或者至少我认为我做到了......目标C有什么不同,locationsArray没有self我添加保留就不会保留。

显然我得到了它的工作,但它花了一段时间,仍然有点困惑为什么。任何帮助,将不胜感激。

4

1 回答 1

1
  1. 是的,如果直接设置实例变量(locationsArray),需要保留值才能保留。您可以像以前那样执行此操作,也可以直接分配/初始化它,这也意味着您拥有它的保留所有权。

  2. self确实等价this于其他 OO 语言。但是在 Obj-C 中,在第一个示例中引用 ivar “naked”和在第二个示例中引用它之间存在语义差异self.locationsArray。前者的行为与您想象的一样,但后者实际上是一个语法快捷方式,[self setLocationsArray: ... ]它会自动为您保留,因为您已将属性标记为is retain

最后一点非常微妙,并且(在我看来)不是预期的或明显的行为。如果您仍然对此感到困惑,请返回 Apple 文档。得到这个真的很重要。

于 2010-07-29T15:12:17.417 回答