f. д. (само за по-ясно разбиране на механизма на съобщенията) Имам клас
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)
or objc_msgSend([NSObject class], "allocWithZone", nil)
?
На практика мисля, че това се нарича objc_msgSend(self, "allocWithZone", nil)
и в този случай self == [MyClass class];
Искам да съм сигурен, че паметта за ivar1 и ivar2 ще бъде разпределена.
Вярно ли е, че когато извикаме super в метода на класа, във функцията objc_msgSend() се предава аргументът "self", който в нашия случай е клас обект на дете? И 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