Ответ 1
Под капотом Objective-C объекты суть C-структуры. Каждый из них содержит поле под названием isa
, которое является указателем на класс, который является экземпляром объекта (то, как объект и среда выполнения Objective-C знают, какой именно объект).
Что касается инициализации переменных: в Objective-C переменные экземпляра автоматически инициализируются на 0
(для типов C, таких как int
) или nil
(для объектов Objective-C). В руководствах Apple говорится, что инициализация ваших ivars этими значениями в ваших методах init
является избыточной, поэтому не делайте этого. Например, скажем, у вас был класс вроде этого:
@interface MyClass : NSObject
{
int myInt;
double myDouble;
MyOtherClass *myObj;
}
@end
Написание вашего метода init
таким образом было бы излишним, так как эти ivars будут инициализироваться до 0
или nil
в любом случае:
@implementation MyClass
- (id)init
{
if ((self = [super init])) {
myInt = 0;
myDouble = 0.0;
myObj = nil;
}
return self;
}
@end
Вместо этого вы можете сделать это:
@implementation MyClass
- (id)init
{
return [super init];
}
@end
Конечно, если вы хотите, чтобы ivars был инициализирован значениями, отличными от 0
или nil
, вы все равно должны их инициализировать:
@implementation MyClass
- (id)init
{
if ((self = [super init])) {
myInit = 10;
myDouble = 100.0;
myObj = [[MyOtherClass alloc] init];
}
return self;
}
@end