内存管理说我们必须release
一个用alloc
创建的对象。考虑一下这个典型的示例代码。
XYZClass *obj = [[XYZClass alloc] init];
// use obj
[obj release];
但在这个例子中,obj
可能不是从alloc
返回的对象,正如苹果的文档所说的
注意:init可能会返回与alloc创建的对象不同的对象,因此最佳做法是嵌套调用,如图所示。
所以这个典型的例子似乎释放了从init
返回的对象,打破了内存管理规则,而没有释放从alloc
返回的对象。这个典型的例子是如何有效的?
首先,代码使用手动内存管理,这是我不建议的,因为Xcode 4.2适用于OS X v10.6和v10.7(64位应用程序),以及iOS 4和iOS,我们支持自动引用计数(ARC),这是一种编译器功能,可提供Objective-C对象的自动内存管理。请参阅过渡到ARC发布说明:
您不必记住何时使用retain、release和自动释放,ARC评估对象的使用寿命要求并自动为您插入适当的内存管理调用在编译时。编译器还生成适当的解除锁定方法。
关于您的特定问题,init可能返回不同的对象这一事实不会破坏内存管理,因为不同的对象将使用相同的分配。这对于初始化器可能返回内部子类的类集群来说是很常见的。