+ (id)alloc;
和
- (id)init;
是NSObject.h中的方法
异种动物
+ (id)alloc {
return _objc_rootAlloc(self);
}
id
_objc_rootAlloc(Class cls)
{
#if 0 && __OBJC2__
// Skip over the +allocWithZone: call if the class doesn't override it.
// fixme not - this breaks ObjectAlloc
if (! ((class_t *)cls)->isa->hasCustomAWZ()) {
return class_createInstance(cls, 0);
}
#endif
return [cls allocWithZone: nil];
}
它执行内存分配,并返回类实例。
但是当我谈到init方法时,这是实现
- (id)init {
return _objc_rootInit(self);
}
id
_objc_rootInit(id obj)
{
// In practice, it will be hard to rely on this function.
// Many classes do not properly chain -init calls.
return obj;
}
它只返回self对象(NSObject),而不进行任何初始化。
这些文档也说明了同样的问题。
“在NSObject类中定义的init方法不进行初始化;它只是返回self。”
如果是这样的话,只有alloc方法就足够了。Init方法仅用于过脊。
这里有什么解释吗?
这是实现源NSObject.mm
http://www.opensource.apple.com/source/objc4/objc4-532/runtime/NSObject.mm
发布于 2014-06-01 12:36:09
alloc
与内存分配有关,而init
(或initX
等,init
系列)则是在创建对象时根据需要配置所分配的内存--无论是现在还是将来某个修订之后的任何特定类,都需要在init
中进行任何工作,这取决于该类的语义。但是,对于任何任意类,您都不知道它是否是init
,因此必须调用它,而且由于任意类都不知道它的超类是否需要进行初始化,所以必须在自己的init
中调用它的超类init
。要使这个链工作,NSObject
必须有一个init
,碰巧它(目前,谁知道将来)不起作用。NSObject
的init
是链的末端,也是唯一不需要调用另一个init
的。
由于许多语言将分配和初始化这两种操作合并为一个不可分割的操作,例如new
中的Java,因此出现了一些混乱。实际上,Cocoa还有一个new
,它被定义为alloc
,后面跟着init
。
苹果公司真的应该这样写:
NSObject类中定义的init方法目前不进行初始化;它只是返回self。
或者干脆什么都没说。
HTH
发布于 2014-06-01 16:26:14
CRD解释得很好。
不过,我会更有力地说明这一点。
在目标C中创建新对象的方法是使用alloc/init。
您应该始终初始化每个对象,并且自定义init方法应该始终调用[super init]
。考虑在所有对象上调用init失败是一个错误,并考虑在自定义init方法中调用[super init]
为一个错误。
https://stackoverflow.com/questions/23984096
复制相似问题