Objective c 使用NSMutableArray保留和自我
在我的.h文件中,我有一个NSMutableArray*locationsArray,它用一个属性定义,如下所示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] (#
@property (nonatomic, retain) NSMutableArray *locationsArray
在我的.m文件中,我显示了一个表视图,这个视图加载得很好,直到我试图卷起它时,它因访问错误而崩溃。这是因为没有保留位置A
这行代码修复了我在.m中的问题
locationsArray = [[Locations loadLocations] retain] (#1)
这行代码也解决了同样的问题
self.locationsArray = Locations.loadLocations (#2)
我有几个问题需要澄清
alloc
init
,alloc initwithArray
self
是这样的,或者至少我认为我做到了…在objective C中有什么不同,没有self
的locationsArray
在没有添加retain的情况下不会被保留self
确实相当于this
。但是,在Obj-C中,在第一个例子中提到的ivar“裸体”和在第二个例子中提到的它是self.locationsArray
之间存在语义差异。前者的行为方式与您想象的相同,但后者实际上是[self-setLocationsArray:…]
的语法快捷方式,它会自动为您保留,因为您已将属性标记为retain
最后一点是非常微妙的,(在我看来)不是预期的或明显的行为。如果你还不清楚,回到苹果文档。了解这一点非常重要。为了避免出现此问题的风险,这就是为什么许多示例使用下划线字符定义IVAR,而属性不使用下划线?这是人们这样做的原因之一,是的。这种范围标记的一般原因是:(a)当您阅读代码时,您可以一眼看到函数内部什么是局部变量,什么是ivar;(b)为了方便起见,当方法(通常是setter)采用相同名称的参数时,您不必编写愚蠢的
字符串
或事件
,以避免在范围内隐藏ivar。值得一提的是,我不喜欢Obj-c2.0中的getter/setter点表示法;我自己不使用它,因为我觉得它更令人困惑而不是有用。YMMV。