2011-12-13 48 views
2

我可能已经跳进了Objective-C的有点太快了,并认为我知道足够的内存管理潜水的。原来我不是。如何设置属性值在Objective-C的正确方法

快进一点,我赶上了......大部分。我最后剩下的问题之一是@ property/@综合过程并正确设置这些值。

我经常看到这样的:

SomeObject *obj = [[SomeObject alloc] init]; 
self.obj = obj; 
[obj release]; 

这是有道理的,但我不知道这实现了类似的事情足以成为一种替代方案:

self.obj = [[[SomeObject alloc] init] autorelease]; 

请问这是可以接受的任何地方,你可能会设置值为@propertyobj?或者是直接访问实例变量优先于init方法中的那两个?

obj = [[SomeObject alloc] init]; 

谢谢。

编辑:绝对相关question讨论我的一半问题。我的问题的autorelease部分被引用在其中一个答案中,但尚未得到确认。

所以我的问题依然存在:

  1. autorelease在这种情况下,一个有效的替代?
  2. autorelease可以用这种方式在init方法中使用,还是应该直接在init方法中设置实例变量?
+0

密切相关的,可能重复:http://stackoverflow.com/questions/7842641/best-way-to-set-a-retained-property-to-a-newly-created-object – 2011-12-13 22:27:13

回答

3

唯一的区别是,在你的第一个例子,obj立即释放(虽然它大概是由self.obj二传手保留)。这两个例子实际上是相同的。

需要注意的是展望未来,我们可以依靠ARC处理在适当的时候释放对象,所以你可以写:

self.obj = [[SomeObject alloc] init]; 

,让ARC担心放在哪里释放或自动释放。

更新:您好像在问-init方法内的情况。你需要知道的两两件事是:

  1. 如果可能的话,你应该直接访问实例变量在-init-dealloc方法。这个想法是为了避免如果您的访问器被子类覆盖时可能发生的问题。还有一些其他的问题,在这里更加深入,使解决这一问题,如:

    Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

  2. 如果你在一个-init方法创建一个对象并将其分配给伊娃,你可能不想在稍后的时间点释放它,例如-dealloc。所以是的,在-init方法中没有释放你创建的对象(只要你保留对它们的引用)就没​​问题,但是你仍然可以在-dealloc中将+alloc-release平衡。

+0

好,那是有道理的。那么`init`方法会发生什么,或者实例变量是否为`nil`?应该直接设置,还是使用`autorelease`的setter很好? – joshhepworth 2011-12-13 22:13:10

相关问题