我可能进入 Objective-C 的速度有点太快了,并以为我对内存管理有足够的了解,可以深入研究。事实证明我不是。
快进一点,我已经 catch 了......大部分。我最后剩下的问题之一是关于 @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
中设置实例变量方法?
最佳答案
唯一的区别是,在第一个示例中,obj
立即释放(尽管它可能由 self.obj
setter 保留)。这两个示例实际上是相同的。
请注意,接下来,我们可以依靠 ARC 来处理在适当的时间释放对象,因此您可以编写:
self.obj = [[SomeObject alloc] init];
让 ARC 关心将发布或自动发布放在哪里。
更新:您似乎在问 -init
方法内部的情况有何不同。您需要注意的两件事是:
如果可能,您应该直接在
-init
和-dealloc
方法中访问 ivars。这个想法是为了避免如果您的访问器被子类覆盖则可能出现的问题。这里还有许多关于 SO 的其他问题可以更深入地解决这个问题,例如:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?
如果您在
-init
方法中创建一个对象并将其分配给 ivar,那么您可能不想在以后再释放它,例如-dealloc
。所以,是的,在-init
方法中不释放您创建的对象(只要您保留对它们的引用)就可以了,但您仍然可以平衡+alloc
code> 与-dealloc
中的-release
。
关于objective-c - 如何正确设置 Objective-C 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496763/