【问题标题】:Retain and self with NSMutableArray使用 NSMutableArray 保留和自我
【发布时间】:2010-07-29 15:07:52
【问题描述】:

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

@property (nonatomic, retain) NSMutableArray *locationsArray

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

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

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

这行代码也修复了同样的问题

self.locationsArray = Locations.loadLocations (#2)

我有几个问题需要澄清

  1. 这是设置此值的正确方法吗,我应该这样做alloc init, alloc initwithArray
  2. 来自 java 世界,我理解 self 是这样的,或者至少我认为我做到了......目标 C 中的不同之处在于,没有 selflocationsArray 在没有我添加的情况下不会被保留保留。

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

【问题讨论】:

    标签: objective-c nsmutablearray retain


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

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

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

    【讨论】:

    • 为了避免这个问题的风险,这就是为什么很多例子都用下划线定义了 ivars 而没有下划线的属性?
    • 这是人们这样做的原因之一,是的。像这样进行范围标记的一般原因是(a)当您阅读代码时,您可以在函数内部一目了然地看到什么是本地 var 和什么是 ivar,以及(b)为了方便,当一个方法(通常是 setter)采用同名参数,您不必编写愚蠢的 theStringanEvent 以避免在范围内隐藏 ivar。对于它的价值,我不喜欢 Obj-C 2.0 中的这种 getter/setter 点表示法;我自己不使用它,因为我发现它比有用更令人困惑。 YMMV。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多