Используйте расширения класса , чтобы добавить класс в ваш файл реализации.Расширение класса - это в основном безымянная категория с несколькими бонусами: объявленные в ней свойства могут быть синтезированы, и все, что объявлено в нем, должно быть в основной реализации, поэтому компилятор может проверить, чтобы убедиться, что вы не пропустили реализацию.Вы должны поместить расширение класса перед вашей реализацией.Вы не можете добавлять переменные экземпляра непосредственно в расширение класса, но вы можете добавить свойства.Когда вы синтезируете методы доступа для свойств, которые не имеют соответствующих переменных экземпляра, новая среда выполнения (os x 10.5 и более поздние версии и все версии iOS, я считаю) автоматически создаст переменные экземпляра.Это означает, что вы не можете создавать свои собственные методы доступа, если только вы не поместите переменную экземпляра в свой заголовок.Закрытые методы могут быть добавлены в расширение класса без ограничений, но, как заметила Аноми, технически возможно использовать их, если вы знаете, как они называются, и с помощью класса-dump ничего не безопасно.
Пример использованиярасширения класса:
@interface MyClass ()
@property (retain) id privateIvar;
@property (readwrite) id readonlyProperty; // bonus! class extensions can be used to make a property that is publicly readonly and privately readwrite
- (void)privateMethod;
@end
@implementation MyClass
@synthesize privateIvar; // the runtime will create the actual ivar, and we just access it through the property
- (void)privateMethod {
...
}
...
Другой способ создания «переменных экземпляра» без помещения их в заголовок или использования свойства заключается в использовании ассоциативных ссылок , которые добавляют данные в объектво время выполнения.Технически они не совпадают с переменными экземпляра, и синтаксис для них более сложный.Поскольку они также требуют нового времени выполнения, есть только две причины, по которым вы бы действительно хотели их использовать: вы хотите добавить переменную экземпляра в категорию (за рамками этого вопроса) или вам нужно, чтобы она была действительнодействительно личное.Ассоциативная ссылка не создает никаких методов и не добавляет к определению класса в скомпилированном коде, поэтому, если вы не создадите для них оболочки, невозможно узнать о них, не спросив объект после добавления данных.См. Внизу страницы, на которую я ссылался, полный пример использования.