ф. е. (просто для более ясного понимания механизма сообщений) У меня есть класс
МойКласс.h
@interface MyClass : NSObject {
int ivar1;
int ivar2;
}
+ (id)instance;
@end
МойКласс.м
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)
or objc_msgSend([NSObject class], "allocWithZone", nil)
?
На практике я думаю, что называется objc_msgSend(self, "allocWithZone", nil)
и в этом случае self == [MyClass class];
Я хочу быть уверен, что память для ivar1 и ivar2 будет выделена.
Правда ли, что когда мы вызываем super в методе класса, в функцию objc_msgSend() передается аргумент «я», который в нашем случае является объектом класса ребенка? И allocWithZone будет "смотреть" объект дочернего класса, чтобы увидеть, сколько памяти должно быть выделено для ivar1 и ivar2.
Спасибо!
MyClass
, вызывая[[MyClass super] alloc]
? - person trojanfoe   schedule 15.08.2013[super alloc]
(или[super allocWithZone]
) выделит достаточно места для дополнительных переменных экземпляра вself
? - person trojanfoe   schedule 15.08.2013alloc
с помощьюsuper
илиself
. Среда выполнения использует приемник для определения размера экземпляра. - person Nikolai Ruhe   schedule 15.08.2013