2010-07-29 55 views
2

保留和自我在我的.h文件我有一个NSMutableArray的* locationsArray与属性定义如下与NSMutableArray的

@property (nonatomic, retain) NSMutableArray *locationsArray 

在我的.m文件我是显示表视图,该装罚款,直到我试图在这一点上它会崩溃,并且访问不畅。这是由于locationsArray没有被保留。

这行代码固定我的问题在.M

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

这行代码还固定了同样的问题

self.locationsArray = Locations.loadLocations (#2) 

我有几个问题我需要澄清

  1. 这是设置这个值的正确方法,我应该做一个allocinitalloc initwithArray
  2. 从java世界中发布我理解self是这样的,还是至少我认为我做过了......目标C中有什么不同,locationsArray没有self没有我保留没有被保留。

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

回答

1
  1. 是的,如果您直接设置实例变量(locationsArray),则需要保留该值以保留它。你可以像你那样做,或者直接分配/初始化,这也意味着你拥有它的保留所有权。

  2. self确实等同于其他OO语言中的this。但是在Obj-C之间,在你的第一个例子中提到伊娃“裸体”之间存在语义差异,并且在第二个例子中将其称为self.locationsArray。前者的表现方式可以想象得到,但后者实际上是[self setLocationsArray: ... ]的句法快捷键,它会自动为您保留,因为您已将该属性标记为retain

这最后一点非常微妙,并且(对我而言)没有预期的或明显的行为。如果您仍然模糊不清,请返回Apple文档。真正重要的是要得到这个。

+0

为了避免这个问题的风险,这就是为什么大量的例子用一个下划线字符和没有下划线的属性定义ivars? – jimsis 2010-08-04 13:42:03

+0

这是人们这样做的一个原因,是的。范围标记的一般原因是这样的:(a)当你阅读代码时,你可以一眼就看到一个函数的内容是什么是局部变量和什么是伊娃,(b)为了方便,当一个方法(通常是一个setter)需要一个相同名称的参数,您不必编写愚蠢的'theString'或'anEvent'来避免在范围内隐藏伊娃。 为什么它不值得我在obj-C 2.0中不喜欢这个getter/setter点符号;我不会自己使用它,因为我觉得它比有用的更困惑。因人而异。 – 2010-08-04 14:44:02