Edw*_*ony 3 xcode objective-c ios
+ (id)alloc;
Run Code Online (Sandbox Code Playgroud)
和
- (id)init;
Run Code Online (Sandbox Code Playgroud)
是来自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];
}
Run Code Online (Sandbox Code Playgroud)
它执行内存分配,并返回一个类实例.
但是当我来到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;
}
Run Code Online (Sandbox Code Playgroud)
它只返回自身对象(NSObject)而不进行任何初始化.
文档也说同样的事情.
"NSObject类中定义的init方法不进行初始化;它只返回self."
如果是这种情况,仅使用alloc方法就足够了.只有覆盖才需要Init方法.
这里有解释吗?
这是实现源NSObject.mm
http://www.opensource.apple.com/source/objc4/objc4-532/runtime/NSObject.mm
alloc是否与内存分配有关init(或者initX等等,init系列)与在创建对象时根据需要配置分配的内存有关 - 现在或将来某些修订后的任何特定类是否需要执行任何工作in init依赖于该类的语义.但是,由于您不知道任何类是否init需要执行任何工作,您必须调用它,并且任何任意类都不知道它的超类是否需要进行任何初始化以必须init在其自己内部调用其超类init.对于这个工作链NSObject必须有一个init,它恰好它(目前,谁知道在将来)没有工作.NSObject这init是链条的终结,也是唯一一个不需要调用另一个链条的链条init.
一些语言将两种操作(分配和初始化)组合成一个不可分割的操作(例如newJava),因此出现了混淆.事实上,Cocoa有一个new定义如下alloc的init.
苹果应该真的写了:
NSObject类中定义的init方法当前不进行初始化; 它只是回归自我.
或者干脆什么也没说.
HTH
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |