IOS: ".cxx_destruct" - скрытый селектор в моем классе

Я использовал ответ на этот вопрос, Селекторы списков для объекта Objective-C и список всех селекторов, на которые отвечает объект класса. В огромном списке я нашел селектор под названием ".cxx_destruct" (да, он начинается с точки), я вижу это впервые и никогда не слышал об этом. Я искал ее и нашел эту ошибку Objective C: ARC (проблемы с автоматическим выпуском).

У меня есть некоторые вопросы в голове?

  • Связано ли это с ARC?
  • Если его селектор, почему он скрыт?
  • Когда он позвонит? Кем сам iOS?
  • Почему его назвали как .cxx_destruct? какая полная форма "cxx"..?

Ответы

Ответ 1

До ARC разработчикам пришлось бы преднамеренно написать процедуру dealloc, чтобы гарантировать, что все ссылки на все объекты, которые они сохранили, были выпущены. Это была ручная и подверженная ошибкам работа.

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

Примечание. Это просто для целей управления счетчиками ссылок при уничтожении объектов. Если вам нужно удалить наблюдателей или выполнить другую работу по очистке, вам все равно потребуется подпрограмма dealloc.

В результате использовался ранее существовавший механизм из objective-c ++, а именно скрытый селектор под названием .cxx_destruct, который вызывается автоматически непосредственно перед освобождением объекта. Этот селектор автоматически запускается во время выполнения Objective C.

Для кода Objective С++ для построения существует параллельная конструкция .cxx_construct.

Опять же, они автоматически генерируются компилятором для борьбы с уничтожением объекта в контексте ARC. Вы можете видеть, что он создается, если вы скомпилируете простой объектный C-код с и без свойства объекта. Возьмите этот пример кода:

#import <Foundation/Foundation.h>

@interface Foo : NSObject

@property (strong) NSObject *anobject;

@end

@implementation Foo
@end

int main()
{
    Foo *f = [[Foo alloc] init];
    return 0;
}

Когда мы компилируем ARC (clang -fobjc-arc test.m -o test -framework foundation) и выгружаем информацию о классе, мы видим селектор .cxx_destruct, когда мы компилируем без ARC (clang -fnoobjc-arc test.m -o test -framework foundation), мы не видим селектор .cxx_destruct. Если вы закомментируете свойство NSObject *anobject и перекомпилируете, вы не увидите .cxx_destruct, поскольку он больше не нужен.