указатель isa в target-c

Я использую их:

  • To вставляет перечисления в классы VCL, которые их не реализуют.
  • To повысить классы VCL.
  • Добавить методы в класс TStrings, чтобы я мог использовать те же методы в моих выведенных списках и в TStringList.
    TGpStringListHelper = class helper for TStringList
    public
      function  Last: string;
      function  Contains(const s: string): boolean;
      function  FetchObject(const s: string): TObject;
      procedure Sort;
      procedure Remove(const s: string);
    end; { TGpStringListHelper }
    
  • Чтобы упростить доступ к полям записи и , удалите литье .

16
задан Rui Peres 12 June 2012 в 14:40
поделиться

1 ответ

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


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

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


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


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

3
ответ дан Nam N. HUYNH 12 June 2012 в 14:40
поделиться