fe (メッセージメカニズムをより明確に理解するためだけに)私はクラスを持っています
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
を呼び出すと、実際には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 に割り当てる必要があるメモリの量を確認します。
ありがとう!