如何在Objective-C中正确设置属性值

时间:2011-12-13 21:57:29

标签: objective-c memory-management

我可能会快速跳入Objective-C并且假设我对内存管理有足够深入的了解。结果我不是。

快进一点,我已经赶上了...大部分时间。我最后剩下的一个问题是关于@ property / @ synthesize过程并正确设置这些值。

我经常看到这个:

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方法中设置实例变量?

1 个答案:

答案 0 :(得分:3)

唯一的区别是,在您的第一个示例中,obj会立即释放(尽管可能由self.obj setter保留)。这两个例子实际上是相同的。

请注意,我们可以依靠ARC在适当的时候处理释放对象,所以你可以写:

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

让ARC担心释放或自动释放的位置。

更新:您似乎在询问-init方法中的情况有何不同。您需要注意的两件事是:

  1. 如果可能,您应该直接使用-init-dealloc方法访问ivars。我们的想法是避免在子类覆盖访问器时可能出现的问题。此处还有许多其他问题可以更深入地解决这个问题,例如:

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

  2. 如果您正在使用-init方法创建对象并将其分配给ivar,则可能不希望稍后将其释放,例如-dealloc。所以,是的,-init方法可以不释放您创建的对象(只要您保留对它们的引用),但您仍然会+alloc-release进行平衡} -dealloc