Категории по NSObject - безопасность
Apple имеет это сказать:
Категории корневого класса
Категория может добавлять методы к любому классу, включая класс root. Методы, добавленные в NSObject, становятся доступными для всех классов, связанных с вашим кодом. Добавление методов к корневому классу с категорией может быть полезно время от времени, но также может быть весьма опасным. Хотя может показаться, что изменения, внесенные в категорию, хорошо понятны и имеют ограниченный эффект, наследование дает им широкий охват. Вы можете делать непреднамеренные изменения невидимых классов в своем приложении; вы можете не знать все последствия того, что вы делаете. Более того, другие, работающие над вашим приложением, которые не знают о ваших изменениях, не поймут, что они делают.
Мой вопрос: если я выберу имена методов, которые являются достаточно странными, я уверен, что никто не будет их использовать (как в Apple, так и в моем проекте), могу ли я все еще попасть в беду? Может ли быть неожиданное поведение? Последствия для эффективности?
Ответы
Ответ 1
Если вы действительно уверены, что Apple никогда не добавит метод этого имени, это безопасно. Если вы хотите усилить эту уверенность, префикс имени селектора. Например, Adium в один момент добавил метод -setObject:atIndex:
к NSMutableArray
(да, просто "косметическая" оболочка по существующему методу API -replaceObject:atIndex
. Очень бессмысленно)... оказалось, что оно имеет то же имя, что и внутренний метод, и veeeeery слегка отличающаяся семантика. Это вызвало сбой, но только на некоторых ОС. Если бы он был назван как-то вроде -AISetObject:atIndex:
, это было бы хорошо.
Последствия для категорий минимальны. Я бы не стал беспокоиться об этом.
Ответ 2
Если ваши имена методов не конфликтуют ни с чем, и люди, которые их используют, знают, что они делают, вы не должны сталкиваться с какими-либо проблемами. Помните, что категория добавляет дополнительные методы, но не переменные экземпляра в класс. Подкласс более гибкий и рассматривается как целый объект, который отвечает всем методам суперкласса плюс его собственный. Я бы сказал, сделать подкласс, если вы не можете или это неудобно делать это. В конце концов, были сделаны категории. Обычно я использую категории, когда у меня есть фреймворк, и мне нужно добавить частные методы в общедоступный класс.