Подтвердить что ты не робот

Isa указатель в objective-c

Из этой справки:

Когда создается новый объект, выделяется память для него, а его инициализируются переменные экземпляра. Первая из переменных объекта является указателем на его структуру классов. Этот указатель, называемый isa, дает доступ объекта к его классу и через класс для всех классы, наследуемые от.

Из того, что я мог понять, прочитав this и this, он позволяет, например, использовать интроспекцию, но прагматичным образом (разработка iOS), , что может программист извлечь из знания/понимания этого специального указателя?

4b9b3361

Ответ 1

Настоящая выгода - лучшее понимание среды выполнения Objective-C, которая на самом деле довольно сложна по сравнению со статическими языками, такими как С++. Указатель isa, на практике, на самом деле не используется так сильно, если вы не взламываете среду выполнения, чтобы сделать что-то особенное. В этом руководстве содержится больше информации о том, как он используется средой выполнения.

Вы действительно не должны использовать isa непосредственно в производственном коде. Это как retainCount - важно, чтобы вы это поняли, но вы никогда не должны его называть.

Ответ 2

В 64-битной среде не следует обращаться к полю ISA объектов. Поле ISA больше не содержит указатель. Он содержит некоторые данные указателя и использует оставшиеся биты для хранения другой информации о времени выполнения. CLASS или OBJECT_GETCLASS можно использовать для чтения поля isa. OBJECT_SETCLASS может использоваться для записи поля isa.

Ref: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW1

Ответ 3

Во время выполнения, когда сообщение отправляется объекту, этот объект переходит к классу, который его создал, и говорит: "Мне было отправлено это сообщение. Запустите код метода сопоставления". Это отличается от большинства языков компиляции, где метод, который должен быть выполнен, определяется во время компиляции.


КАК ОБЪЕКТ ЗНАТЬ, ЧТО КЛАСС СОЗДАЛ ЭТО?

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


Объект реагирует только на сообщение, если его класс (указанный указателем isa) реализует связанный с ним метод. Поскольку это происходит во время выполнения, XCode не всегда может определить время компиляции (когда приложение построено), будет ли объект отвечать на сообщение. XCode предоставит вам сообщение об ошибке, если он считает, что вы отправляете сообщение объекту, который не отвечает, но если он не уверен, он позволит создавать приложение.


Если по какой-либо причине (и есть много возможностей), вы в конечном итоге отправляете сообщение объекту, который не отвечает, ваше приложение будет вызывать исключение. Таким образом, указатель isa является причиной ошибки времени выполнения. Здесь можно проверить подробности и пример: IOS - Objective-C - Исключения и непризнанные селектор

Ответ 4

isa указывает на объект класса, поэтому это будет работать

if(self->isa == [self class])
    NSLog(@"True");

Понимание того, как это использовать, будет иметь некоторые преимущества, такие как интроспекция и тесты объектов класса созданного объекта