Что означает isa в objective-c?

Я хотел бы знать смысл приведенных ниже строк с примером. Я не могу понять, что на самом деле означают линии. Строки из руководства по кодированию google objective-c.

Инициализация
Не инициализируйте переменные в 0 или ноль в методе init; он лишний.

Вся память для вновь выделенного объекта инициализируется до 0 (кроме isa), поэтому не загромождайте метод init путем повторной инициализации переменных до 0 или nil.

Ответ 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

Ответ 2

Когда объекты распределяются по времени выполнения Objective-C, вся память, в которой хранятся переменные экземпляра, обнуляется для вас, поэтому нет необходимости устанавливать переменные экземпляра в 0 или nil. Вы можете установить их на любое значение, которое вы хотите. Некоторые разработчики даже игнорируют избыточность и устанавливают переменные экземпляра в 0 в любом случае только для объяснительных или описательных целей.

isa означает, что "есть". Каждый объект Objective-C (включая каждый класс) имеет указатель isa. Среда выполнения следует за этим указателем, чтобы определить, какой класс является объектом, поэтому он знает, на какие селекторы отвечает объект, каков его суперкласс, какие свойства имеет объект и т.д.