Ответ 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
, поскольку он больше не нужен.