首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用[[超级分配区:nil] init],消息传递机制

调用[[超级分配区:nil] init],消息传递机制
EN

Stack Overflow用户
提问于 2013-08-15 09:08:57
回答 1查看 229关注 0票数 2

(为了更清楚地理解消息机制)我有课。

MyClass.h

代码语言:javascript
复制
@interface MyClass : NSObject {
   int ivar1;
   int ivar2;
}

+ (id)instance;

@end

MyClass.m

代码语言:javascript
复制
static MyClass* volatile _sInstance = nil;

@implementation MyClass

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

@end

实际上,当调用objc_msgSend时,会发送什么[super allocWithZone:nil]

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“参数,在我们的例子中是子类的类对象,这是真的吗?allocWithZone将“查看”子类对象,以查看应该为ivar1和ivar2分配多少内存。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-15 09:37:48

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

在类方法的情况下,接收方再次是类指针,但与super_class不一样。在您的示例中,接收器是MyClass指针,而super_class指针是NSObject

两方面的注释:我建议不要把精力写在最时髦的单子上。最好由开发人员来创建自己的实例或使用提供的共享实例。请注意双重检查锁断了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18249569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档