(为了更清楚地理解消息机制)我有课。
MyClass.h
@interface MyClass : NSObject {
int ivar1;
int ivar2;
}
+ (id)instance;
@endMyClass.m
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分配多少内存。
谢谢!
发布于 2013-08-15 09:37:48
编译器将发送给super的任何消息翻译为objc_msgSendSuper (而不是objc_msgSend)。第一个参数是指向结构的指针。结构包含指向当前实现的超类的指针和指向接收方的指针。在运行时需要前者来搜索重写的实现,后者用作第一个参数。
在类方法的情况下,接收方再次是类指针,但与super_class不一样。在您的示例中,接收器是MyClass指针,而super_class指针是NSObject。
两方面的注释:我建议不要把精力写在最时髦的单子上。最好由开发人员来创建自己的实例或使用提供的共享实例。请注意双重检查锁断了。。
https://stackoverflow.com/questions/18249569
复制相似问题