调用[[super allocWithZone:nil] init],消息传递机制

时间:2013-08-15 09:08:57

标签: iphone ios objective-c c nsobject

F。即(只是为了更清楚地了解消息机制)我有课

MyClass.h

@interface MyClass : NSObject {
   int ivar1;
   int ivar2;
}

+ (id)instance;

@end

MyClass.m

static MyClass* volatile _sInstance = nil;

@implementation MyClass

+ (id)instance {
       if (!_sInstance) {
       @synchronized(self) {
           if (!_sInstance) {
               _sInstance = [[super allocWithZone:nil] init];
           }
       }
   }
   return _sInstance;
}

@end

实际上在调用[super allocWithZone:nil]时会在objc_msgSend中发送什么内容?

objc_msgSend([MyClass class], "allocWithZone", nil)objc_msgSend([NSObject class], "allocWithZone", nil)

在实践中,我认为这称为objc_msgSend(self, "allocWithZone", nil),在这种情况下称为self == [MyClass class];

我想确保分配ivar1和ivar2的内存。

是真的,当我们在类方法中调用super时,在objc_msgSend()函数中传递“self”参数,在我们的例子中是child的类对象吗?而allocWithZone将“查看”子类对象,以查看应为ivar1和ivar2分配多少内存。

谢谢!

1 个答案:

答案 0 :(得分:3)

编译器将super的任何邮件翻译为objc_msgSendSuper(不是objc_msgSend)。第一个参数是指向结构的指针。该struct包含一个指向当前实现的超类的指针和一个指向接收器的指针。在运行时期间需要前者来搜索重写的实现,后者用作第一个参数。

在类方法的情况下,接收器又是类指针,但与super_class不同。在您的情况下,接收器是MyClass指针,而super_class指针是NSObject

两个旁注:我建议不要把精力放在写出最高级的单身人士身上。最好让开发人员创建自己的实例或使用提供的共享实例。请注意double-checked locking is broken