Apple недавно опубликовала Переход к примечаниям к выпуску ARC , документ, который объясняет ARC и решает некоторые вопросы преобразования не-ARC-кода в ARC.В этих примечаниях они упоминают следующее:
Если вы [sic] обнаружите, что должны реализовать пользовательские методы сохранения или выпуска, то вы также должны реализовать следующий метод в своем классе:
-(BOOL)supportsWeakPointers { return NO; }
Этот метод предотвратит формирование слабых указателей на ваши объекты.Настоятельно рекомендуется найти решение, которое не требует реализации собственных методов хранения и выпуска вместо этого.
Рассмотрим следующий сценарий:
Объявите класс MyClass и реализуйте -supportsWeakPointers как возвращающий NO.Скажите Xcode скомпилировать соответствующий файл реализации с -fno-objc-arc.Для правильности измерения объявите класс как NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE и переопределите -release и -retain.
В MainMenu.xib поместите объект верхнего уровня типа MyClass.
В делегате приложения укажите слабое свойство IBOutlet для экземпляра MyClass:
@property (weak) IBOutlet MyClass *myObject;
и подключите его к соответствующему объекту в файле пера. В этом случаепоскольку объект является пером верхнего уровня, а владелец файла имеет тип NSApplication, этот объект создается с дополнительным счетчиком ссылок , что означает, что он должен оставаться в живых до явного выпуска.Для ARC это означает вызов CFRelease (), поскольку ARC запрещает отправку сообщения о выпуске.
У меня вопрос в два раза в три раза :
Почему -supportsWeakPointers
метод экземпляра вместо метода класса?Есть ли какой-нибудь случай, когда у класса могут быть экземпляры, отличающиеся разрешением слабых ссылок?
-supportsWeakPointers никогда не отправляется экземпляру MyClass, созданному при загрузке файла пера;Зачем?Я проверил это, поместив в него NSLog () и добавив символическую точку останова в Xcode.Кроме того, я никогда не получаю сообщение
cannot form weak reference to instance (0x???) of class MyClass
при запуске программы.
Объект nib верхнего уровня типа MyClass никогда не должен освобождатьсяво время выполнения программы, потому что моя программа никогда не выпускает его.Однако соответствующий слабый выходной сигнал равен нулю после загрузки файла пера;Зачем?Изменение свойства outlet на сильные результаты приводит к тому, что объект отличается от nil, но в этом нет необходимости. На самом деле этого не происходит;извиняюсь.Я тестировал версию, в которой был назначен новый новый объект, который в действительности не использовался, поэтому ARC правильно присвоил nil
свойству.
Пример проекта, который воспроизводит эту ошибку:доступно здесь .
Я использую Xcode 4.2 с Apple LLVM Compiler 3.0 на Mac OS X версии 10.7.2.