Категории на NSObject - обеспечение безопасности - PullRequest
10 голосов
/ 14 июля 2011

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 14 июля 2011

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

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

1 голос
/ 14 июля 2011

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

...