F。 e。 (只是为了更好地了解消息机制)我上课了
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分配多少内存。
谢谢!
最佳答案
编译器会将对super
的任何消息翻译为objc_msgSendSuper
(不是objc_msgSend
)。第一个参数是指向结构的指针。该结构包含一个指向当前实现的 super class 的指针和一个指向接收器的指针。运行时在搜索覆盖的实现时需要前者,后者用作第一个参数。
在使用类方法的情况下,接收者仍然是类指针,但与super_class
不同。在您的情况下,接收者是MyClass
指针,而super_class
指针将是NSObject
。
两个注意事项:我建议不要花精力编写最出色的Singleton。最好由开发人员自行创建实例或使用提供的共享实例。并且请注意double-checked locking is broken。