Что значит isa в target-c? - PullRequest
       0

Что значит isa в target-c?

39 голосов
/ 04 августа 2010

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

Initialization
Не инициализируйте переменные в 0 или nil в методе init; это избыточно.

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

Ответы [ 2 ]

90 голосов
/ 04 августа 2010

Под капотом объекты 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
30 голосов
/ 04 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...