Подтвердить что ты не робот

Категории по NSObject - безопасность

Apple имеет это сказать:

Категории корневого класса

Категория может добавлять методы к любому классу, включая класс root. Методы, добавленные в NSObject, становятся доступными для всех классов, связанных с вашим кодом. Добавление методов к корневому классу с категорией может быть полезно время от времени, но также может быть весьма опасным. Хотя может показаться, что изменения, внесенные в категорию, хорошо понятны и имеют ограниченный эффект, наследование дает им широкий охват. Вы можете делать непреднамеренные изменения невидимых классов в своем приложении; вы можете не знать все последствия того, что вы делаете. Более того, другие, работающие над вашим приложением, которые не знают о ваших изменениях, не поймут, что они делают.

Мой вопрос: если я выберу имена методов, которые являются достаточно странными, я уверен, что никто не будет их использовать (как в Apple, так и в моем проекте), могу ли я все еще попасть в беду? Может ли быть неожиданное поведение? Последствия для эффективности?

4b9b3361

Ответ 1

Если вы действительно уверены, что Apple никогда не добавит метод этого имени, это безопасно. Если вы хотите усилить эту уверенность, префикс имени селектора. Например, Adium в один момент добавил метод -setObject:atIndex: к NSMutableArray (да, просто "косметическая" оболочка по существующему методу API -replaceObject:atIndex. Очень бессмысленно)... оказалось, что оно имеет то же имя, что и внутренний метод, и veeeeery слегка отличающаяся семантика. Это вызвало сбой, но только на некоторых ОС. Если бы он был назван как-то вроде -AISetObject:atIndex:, это было бы хорошо.

Последствия для категорий минимальны. Я бы не стал беспокоиться об этом.

Ответ 2

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