Cocoa のクラスで使用されているのと同じイディオムを使用できます。NSString.h の NSString クラス インターフェイスを見ると、インスタンス変数が宣言されていないことがわかります。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:をオーバーロードすることにあります。このコードは、 NSObjectによって提供されるデフォルトのallocによって呼び出されるため、どの割り当てメソッドを使用する必要があるかを心配する必要はありません (どちらも有効です)。このようなallocWithZone:では、 Foundation 関数NSAllocateObject()を使用してメモリを割り当て、 MyClassの代わりにMyClassImplオブジェクトのisaを初期化できます。その後、ユーザーはMyClassImplオブジェクトを透過的に処理します。
もちろん、クラスの実際の実装はMyClassImplによって提供されます。MyClassのメソッドは、メッセージの受信をエラーと見なす方法で実装する必要があります。