2012-01-06 4 views
0

Я расширил NSScrollView, чтобы не перевернуть категорию (по умолчанию она перевернулась). Затем я добавил NSScrollView в мое приложение с помощью Interface Builder. NSScrollView перевернут.Почему загрузка nib поднимает мои категории?

Как это может произойти? Я не включаю свою категорию в любой исходный файл в свой проект. Я только компилирую его, в котором, кажется, как-то хватит. И я сделал чистую сборку, чтобы быть в безопасности.

И самое главное: как я могу изменить это поведение? Я не хочу, чтобы мои перья автоматически выбирали все категории, которые они могут найти, с другой стороны, может быть удобно иногда включать их. Но я всегда видел категории как отказ, а не отказ, поскольку это, кажется, здесь.

Любая идея?

ответ

4

Категории распространяются на весь класс; все экземпляры NSScrollView ANYWHERE в вашей программе подберут новое поведение. По этой причине обычно не рекомендуется переопределять существующие методы в категории; вы меняете поведение этого метода для всех пользователей, а не только ваших собственных экземпляров.

Таким образом, категории не являются ни отказом, ни отказами; они являются абсолютными и второстепенными. Если категория скомпилирована в программу, то каждый экземпляр этого класса будет затронут. Они не могут ни отказаться, ни отказаться; новое поведение принудительно навязывается им во время выполнения. Помните об этом при использовании категорий.

Если вы хотите изменить поведение для экземпляров, тогда вы должны сделать подкласс NSScrollView (назовем его UnflippedScrollView или что-то еще) и переопределить метод там. Затем используйте свой подкласс, где вам понадобится неперемещаемый вид прокрутки.

+2

Просто чтобы подчеркнуть что-то из вопроса: «Я не включаю свою категорию в какой-либо исходный файл в свой проект. Я только компилирую его, в котором, кажется, как-то хватит ». Это точно верно. Если категория существует вообще в вашей программе, для которой единственным требованием является то, что она будет создана целевым объектом, то она влияет на класс во всей вашей программе, включая все экземпляры повсюду, в том числе в nib. –

+1

Чтобы продвинуть этот момент еще дальше: никогда не переопределяйте существующий метод с категорией. Некоторые методы Apple framework сами реализуются в категориях. Если две категории реализуют один и тот же метод, поведение не определено. Переопределение должно выполняться в подклассах, а не в категориях. Категории предназначены для добавления новых методов, а не для переопределения существующих. –

+1

Следующее по пункту Петра: категории относятся ко всем экземплярам класса с точки, в которую загружается категория (они эффективно применяются ретроактивно к существующим экземплярам). Это имеет значение в случаях, когда вы реализуете категорию в динамической библиотеке и загружаете ее вручную. Когда вы загружаете библиотеку, класс изменяется. Дело в том, что в принципе категории могут изменять классы в любой момент времени (не только при запуске приложения), что делает переопределение категории еще более недетерминированным. –

Смежные вопросы