在我的.h文件中,我有一个NSMutableArray * locationsArray使用如下属性定义
@property (nonatomic, retain) NSMutableArray *locationsArray
在我的.m文件中,我正在显示一个表视图,这个加载正常,直到我试图卷起,此时我崩溃了访问不良。这是因为locationsArray没有被保留。
这行代码解决了我在.m
中的问题locationsArray = [[Locations loadLocations] retain] (#1)
这行代码也解决了同样的问题
self.locationsArray = Locations.loadLocations (#2)
我有几个问题需要澄清
alloc
init
,alloc initwithArray
吗?self
就是这个,或者至少我以为我做过......目标C的不同之处是locationsArray
没有self
不是在没有我添加保留的情况下保留。显然我让它工作但是它花了一段时间而且仍然有点困惑为什么。任何帮助将不胜感激。
答案 0 :(得分:1)
是的,如果直接设置实例变量(locationsArray),则需要保留该值以保留它。你可以像你那样做,或直接分配/初始化它,这也意味着你保留了它的所有权。
self
确实等同于其他OO语言中的this
。但是Obj-C在你的第一个例子中引用了一个“裸体”,而在第二个例子中引用它是self.locationsArray
之间存在语义差异。前者表现出你的想象,但后者实际上是[self setLocationsArray: ... ]
的句法快捷方式,它会自动为你保留,因为你已将该属性标记为retain
。
这最后一点非常微妙,(我认为)不是预期或明显的行为。如果您仍然模糊不清,请返回Apple文档。得到这个非常重要。