Под капотом объекты 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
таким способом было бы излишним, поскольку эти ивары в любом случае будут инициализированы в 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
Конечно, если вы хотите, чтобы ивары были инициализированы значениями, отличными от 0
или nil
, вы все равно должны их инициализировать:
@implementation MyClass
- (id)init
{
if ((self = [super init])) {
myInit = 10;
myDouble = 100.0;
myObj = [[MyOtherClass alloc] init];
}
return self;
}
@end