Нет никакого реального преимущества в этом; в общем случае следует ожидать, что клиенты вашего интерфейса будут соблюдать контракт этого интерфейса.
В случае многих значений Foundation и типов контейнеров (NSString
и т. Д.) Это имеет значение еще меньше; благодаря деталям реализации механизма бесплатного доступа мостовые и неизменяемые варианты фактически являются экземплярами одного и того же класса. Например, методы init
для NSString и NSMutableString фактически возвращают экземпляр __NSCFString, который наследуется от обоих. Этот объект сохраняет изменчивость или неизменность вызванного вами API, но вы не можете определить, глядя на класс, является ли он изменяемым или нет.
Другими словами, [aString isKindOfClass:[NSMutableString class]]
всегда будет возвращать YES
, независимо от того, создали ли вы изменяемый объект или нет. В результате, использование этого API для проверки, является ли что-то изменяемым или нет, так или иначе, не имеет смысла беспокоиться о том, попытаются ли клиенты вашего API сделать это.
Edit:
Первоначально я заявил, что вы не можете определить, проверяя класс массива, является ли он изменяемым или нет, но оказывается, что в случае NSArray
вы можете сказать. (Спасибо @albertamg за обнаружение ошибки.) Я изменил приведенные выше примеры, чтобы использовать NSString
, что является случаем, когда вы действительно не можете сказать. В целом, однако, я бы посчитал ошибкой, если бы кто-то рассматривал возвращаемый вами объект как изменяемый, если он не был обработан как таковой, и не заботился бы о программировании вокруг него.
Изменить еще раз:
Так что получается, что в некоторых версиях OS X и iOS вы также не можете обнаружить изменчивость NSArray
, но в более поздних версиях они изменили реализацию так, что вы можете. Вы все еще не можете обнаружить это в NSString
, хотя. Таким образом, урок, который следует извлечь из всего этого, заключается в том, что вам не следует использовать isKindOfClass:
для объектов, которые являются частью кластера классов .