2

ファイルから初期化する基本クラスがありnibます。これからどのように継承できますかclass。それを初期化するたびに、作成しようとしてsubclassいる実際のオブジェクトではなく、基本クラスのオブジェクトが作成されますclass

基本クラス

@implementation BaseClass
- (id)init{
   self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" 
                                          owner:self 
                                        options:nil] lastObject] retain];
   if (self){
   }

   return self;
}

@end

Aクラス

@implementation MyClass //Inheriting from BaseClass
- (void)init {
   self = [super init];

   if (self) {
   }

   return self;
}

- (void)methodSpecificToThisClass {
   //do something
}
@end

使用法

// It crashes when I call 'methodSpecificToThisClass' 
// because the type that has been created is a type 
// of my BaseClass instead of MyClass
MyClass *myClass = [[MyClass alloc] init];
[myClass methodSpecificToThisClass];
4

2 に答える 2

3

self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" owner:self options:nil] lastObject] retain];に 変更self = [[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] lastObject] retain];

これはもちろん、ビュー タイプごとに別々のペン先があることを前提としています。

于 2011-08-01T22:50:21.157 に答える
2

常に同じ nib ファイルからオブジェクトをロードしているため、常に同じオブジェクトを取得できます。nibのオブジェクトが type の場合、nib をロードするBaseClassと type のオブジェクトが取得されます。ロードされたオブジェクトに割り当てるため、割り当てたものは機能しませんBaseClass。(実際には、 を再割り当てする前に割り当てられたメモリを決して解放しないため、割り当てられたメモリをリークしています。) また、ポインタを -- として宣言したかどうかも問題ではありません。これにより、取得せずに呼び出すことができます。コンパイラからの苦情ですが、実際のオブジェクトがのインスタンスであるという事実は変わりませんMyClassselfselfMyClass*-methodSpecificToThisClassBaseClass. そのメソッドを呼び出すと、ランタイムがセレクターを解決しようとして、そのオブジェクトに対してセレクターが存在しないことが判明すると、「実装されていないセレクター」エラーが発生します。

ペン先からをロードする場合は、 の代わりにMyClassを含むペン先を使用する必要があります。MyClassBaseClass

于 2011-08-02T01:25:36.757 に答える