IBOutlet для NSTextView в проекте ARC

Как вы читаете здесь, в большинстве случаев IBOutlet должен быть слабым.

Теперь, как вы можете прочитать в библиотека разработки не все классы поддерживают слабые ссылки. (например, NSTextView). Это означает, что вы должны использовать assign:

@property (assign) IBOutlet NSTextView *textView;

Если вы используете слабую ссылку, вы получите следующую ошибку: «Синтез слабо-недоступного свойства запрещен, поскольку он требует синтеза ivar объекта __weak».

Документация не упомянула, что теперь вам нужно снова установить для свойства значение nil после его использования, например. методом dealloc:

- (void)dealloc
{
    self.textView = nil;
} 

Насколько я понял, классы, отмеченные NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE, не поддерживают слабые ссылки, но в чем причина?


person Stephan    schedule 14.10.2012    source источник
comment
Согласно связанному сообщению, IBOutlets должно быть сильным по умолчанию!   -  person Jay    schedule 08.07.2016


Ответы (1)


Я думаю, что нашел причину, по которой некоторые классы не поддерживают слабую ссылку:

Как вы можете прочитать здесь:

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

person Stephan    schedule 14.10.2012