Как я могу добавить переменные-члены и методы во встроенный класс (скажем, NSString), не создавая его подклассов.
Для методов: вы можете использовать категории для добавления методов-членов без создания подклассов. В Какао - довольно распространенная практика - добавлять методы расширения для каждой платформы.
Например, переменные: начиная со Snow Leopard (Mac OS X 10.6), вы можете использовать ассоциативные ссылки . Вы используете их для имитации добавления переменных экземпляра объекта к существующему классу.
Язык программирования Objective-C довольно исчерпывающий по тому, что вы можете делать как с ассоциативными ссылками, так и с категориями.
«Категории» позволяют добавлять методы, но не переменные-члены, к существующим классам.
См. Раздел этого руководства по ним (поиск на странице): http://cocoadevcentral.com/d/learn_objectivec/ Или найдите Категории в документации Objective-C где-нибудь еще .
Вы не можете добавлять переменные экземпляра без создания подклассов.
Вы не можете. Иногда создавать подклассы - плохая идея (например, вы работаете с кластером классов), поэтому люди часто обходят это, создавая совершенно новый класс (подкласс NSObject, а не рассматриваемого класса), который содержит переменная экземпляра, тип которой является рассматриваемым классом, а также желаемые добавленные переменные.
Например, если вы хотите создать подкласс NSString с дополнительным BOOL под названием «foo» ...
@interface StringWithFoo : NSObject
{
NSString* string;
BOOL foo;
}
... а затем реализовать любые нужные вам методы или создать общедоступный метод доступа, чтобы вы могли вызывать методы непосредственно в строке или даже использовать причудливые уловки во время выполнения для соответствующей пересылки сообщений (задайте новый вопрос, если это то, что вы хотите сделать).
Вы можете добавлять методы-члены в класс без создания подклассов путем создания категории, но это не позволит вам добавлять переменные-члены.
Хотя во время выполнения в objective-c можно сделать много чего, чего нельзя сделать на других языках (см. справочник по времени выполнения ), я бы не стал предлагать столько хакерских приемов для добавления экземпляра переменная в существующий класс.
Не могли бы вы объяснить причину, по которой вы не хотите создавать подклассы? Подкласс или категория действительно кажется лучшим вариантом.