0

次の単純なクラス階層を見てください。

Tree.h :

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end

Tree.m :

@implementation Tree
@synthesize delegate;
@end

Aspen.h :

@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end

アスペン.m :

@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end

しようとするとself.delegate = d;、次のエラーが発生します。

-[Aspen setDelegate:]: 認識されないセレクターがインスタンス 0x586da00 に送信されました

Tree親クラスのプロパティがそのままサブクラスに表示されることを期待していましたdelegateが、エラーは親クラスの合成されたセッターが表示されないことを示しているため、そうではないようです。

私は何が欠けていますか?サブクラス レベルでプロパティを再宣言する必要がありますか? @dynamicの実装の先頭に追加しようとしましたAspenが、それもうまくいきませんでした。ここでは非常に単純な概念ですが、解決策を見つけようとして探し回るのに 1 時間を費やしました。この時点でアイデアがありません。

- 編集 -

上記のコードは、私が見ている問題を示すための非常に簡素化された例です。

4

2 に答える 2

1

プロトコル、それを実装するオブジェクト、必要な機能、および機能によって補完されたコードを試してみましたがimportmain私のシステムでは魅力的に機能します。

#import <Foundation/Foundation.h>

@protocol TreeDelegate <NSObject>
@end

@interface MyDelegate : NSObject <TreeDelegate>
@end

@implementation MyDelegate
@end

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end

@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end

@implementation Tree
@synthesize delegate;
@end

@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end

int main(int argc, char ** argv) {
    MyDelegate * d = [[MyDelegate alloc] init];
    Aspen * a = [[Aspen alloc] init];

    [a grow:d];
    return 0;
}
于 2013-01-19T00:24:04.347 に答える
0

私はついにこれを理解することができました。Tree私の実際のコードは、クラスとAspen私の例を定義するサードパーティの静的ライブラリを活用しています。私の例で与えられたものを公開する静的ライブラリの新しいバージョンを構築しましたTree delegateが、プロジェクトに追加した後にライブラリを適切に再リンクしなかったため、実行時に古いバージョンがまだアクセスされていました。

学んだ教訓: サード パーティのライブラリをインポートする手順に熱心に取り組み、単純な基本的なプログラミングの概念 (例のテキストなど) が機能しない場合は、一歩下がって、i をドットで囲み、t を交差させていることを確認してください。

于 2013-01-22T17:39:01.210 に答える