我可能会快速跳入Objective-C并且假设我对内存管理有足够深入的了解。结果我不是。
快进一点,我已经赶上了...大部分时间。我最后剩下的一个问题是关于@ property / @ synthesize过程并正确设置这些值。
我经常看到这个:
SomeObject *obj = [[SomeObject alloc] init];
self.obj = obj;
[obj release];
这是有道理的,但我想知道这是否足以成为另类的东西:
self.obj = [[[SomeObject alloc] init] autorelease];
在您设置@property
,obj
的值的任何地方都可以接受吗?或者是直接访问优先于init
方法中的两个实例变量的实例变量?
obj = [[SomeObject alloc] init];
感谢。
编辑:绝对相关的question,讨论了我的一半问题。我的问题的autorelease
部分在其中一个答案中被引用,但尚未得到确认。
所以我的问题仍然存在:
autorelease
是否有效?autorelease
方法可以init
这样使用,还是应该直接在init
方法中设置实例变量?答案 0 :(得分:3)
唯一的区别是,在您的第一个示例中,obj
会立即释放(尽管可能由self.obj
setter保留)。这两个例子实际上是相同的。
请注意,我们可以依靠ARC在适当的时候处理释放对象,所以你可以写:
self.obj = [[SomeObject alloc] init];
让ARC担心释放或自动释放的位置。
更新:您似乎在询问-init
方法中的情况有何不同。您需要注意的两件事是:
如果可能,您应该直接使用-init
和-dealloc
方法访问ivars。我们的想法是避免在子类覆盖访问器时可能出现的问题。此处还有许多其他问题可以更深入地解决这个问题,例如:
Why shouldn't I use Objective C 2.0 accessors in init/dealloc?
如果您正在使用-init
方法创建对象并将其分配给ivar,则可能不希望稍后将其释放,例如-dealloc
。所以,是的,-init
方法可以不释放您创建的对象(只要您保留对它们的引用),但您仍然会+alloc
与-release
进行平衡} -dealloc
。