Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用NSMutableArray保留和自我_Objective C_Nsmutablearray_Retain - Fatal编程技术网

Objective c 使用NSMutableArray保留和自我

Objective c 使用NSMutableArray保留和自我,objective-c,nsmutablearray,retain,Objective C,Nsmutablearray,Retain,在我的.h文件中,我有一个NSMutableArray*locationsArray,它用一个属性定义,如下所示 @property (nonatomic, retain) NSMutableArray *locationsArray 在我的.m文件中,我显示了一个表视图,这个视图加载得很好,直到我试图卷起它时,它因访问错误而崩溃。这是因为没有保留位置A 这行代码修复了我在.m中的问题 locationsArray = [[Locations loadLocations] retain] (#

在我的.h文件中,我有一个NSMutableArray*locationsArray,它用一个属性定义,如下所示

@property (nonatomic, retain) NSMutableArray *locationsArray
在我的.m文件中,我显示了一个表视图,这个视图加载得很好,直到我试图卷起它时,它因访问错误而崩溃。这是因为没有保留位置A

这行代码修复了我在.m中的问题

locationsArray = [[Locations loadLocations] retain] (#1)
这行代码也解决了同样的问题

self.locationsArray = Locations.loadLocations (#2)
我有几个问题需要澄清

  • 这是设置此值的正确方法吗?我是否应该执行
    alloc
    init
    alloc initwithArray
  • 我从java世界中了解到
    self
    是这样的,或者至少我认为我做到了…在objective C中有什么不同,没有
    self
    locationsArray
    在没有添加retain的情况下不会被保留
  • 很明显,我让它工作了,但花了很长时间,我仍然有点困惑为什么。任何帮助都将不胜感激

  • 是的,如果直接设置实例变量(locationsArray),则需要保留该值以保留它。您可以按原样操作,也可以直接alloc/init它,这也意味着您拥有它的所有权

  • 在其他OO语言中,
    self
    确实相当于
    this
    。但是,在Obj-C中,在第一个例子中提到的ivar“裸体”和在第二个例子中提到的它是
    self.locationsArray
    之间存在语义差异。前者的行为方式与您想象的相同,但后者实际上是
    [self-setLocationsArray:…]
    的语法快捷方式,它会自动为您保留,因为您已将属性标记为
    retain


  • 最后一点是非常微妙的,(在我看来)不是预期的或明显的行为。如果你还不清楚,回到苹果文档。了解这一点非常重要。

    为了避免出现此问题的风险,这就是为什么许多示例使用下划线字符定义IVAR,而属性不使用下划线?这是人们这样做的原因之一,是的。这种范围标记的一般原因是:(a)当您阅读代码时,您可以一眼看到函数内部什么是局部变量,什么是ivar;(b)为了方便起见,当方法(通常是setter)采用相同名称的参数时,您不必编写愚蠢的
    字符串
    事件
    ,以避免在范围内隐藏ivar。值得一提的是,我不喜欢Obj-c2.0中的getter/setter点表示法;我自己不使用它,因为我觉得它更令人困惑而不是有用。YMMV。