Вы можете использовать ту же идиому, которая используется в классах Какао.Если вы посмотрите на интерфейс класса NSString в NSString.h, вы увидите, что не объявлена переменная экземпляра.Углубившись в исходный код GNUstep, вы найдете хитрость.
Рассмотрим следующий код.
MyClass.h
@interface MyClass : NSObject
// Your methods here
- (void) doSomething;
@end
MyClass.m
@interface MyClassImpl : MyClass {
// Your private and hidden instance variables here
}
@end
@implementation MyClass
+ (id) allocWithZone:(NSZone *)zone
{
return NSAllocateObject([MyClassImpl class], 0, zone);
}
// Your methods here
- (void) doSomething {
// This method is considered as pure virtual and cannot be invoked
[self doesNotRecognizeSelector: _cmd];
}
@end
@implementation MyClassImpl
// Your methods here
- (void) doSomething {
// A real implementation of doSomething
}
@end
Как видите, хитрость заключается в перегрузке allocWithZone: в вашем классе.Этот код вызывается по умолчанию alloc , предоставленным NSObject , поэтому вам не нужно беспокоиться о том, какой метод распределения следует использовать (оба действительны).В таком allocWithZone: вы можете использовать функцию Foundation NSAllocateObject () для выделения памяти и инициализации isa для объекта MyClassImpl вместо MyClass .После этого пользователь прозрачно обрабатывает объект MyClassImpl .
Конечно, реальная реализация вашего класса должна обеспечиваться MyClassImpl .Методы для MyClass должны быть реализованы таким образом, чтобы считать получение сообщения ошибкой.