0

ラベルを更新するために、HelloWorldLayer からメッセージを送信し、ScoreLayer で受信したいと考えています。は正常に動作しますCCLOG(@"///addNewScore");updateScore、ScoreLayer では呼び出しを受けません。なぜでしょうか? これが私のコードです:(編集: @property で「保持」を試みましたが、何も変わりません):

@interface HelloWorldLayer : CCLayer
{
    //...
    id<ScoreDelegate>delegate;
}

@property (nonatomic,retain) id <ScoreDelegate> delegate;


@implementation HelloWorldLayer
@synthesize delegate;
//...
-(void)addNewScore:(int)num{
    CCLOG(@"///addNewScore");//works fine
    [delegate updateScore:num];
}


#import <Foundation/Foundation.h>

@protocol ScoreDelegate
-(void)updateScore:(int)num;
@end

@interface ScoreLayer : CCLayer <ScoreDelegate>{
    //...
}

-(void)updateScore:(int)num{
    CCLOG(@"hello");//DOES NOT WORK
}

@end

どうもありがとう

4

2 に答える 2

2

あなたの電話の前に ScoreLayer が解放されているのではないかと思います。私はassignARC Objective-C しか書いたことがありません。しかし、それはweakとほぼ同じだと思います(デリゲートの場合)。これは、そのポインターが有効であるためには、アプリケーション内の誰かが ScoreLayer を「所有」する必要があることを意味します。

そうは言っても、そもそも 2 つのオブジェクトを適切に接続していると仮定しただけです。それを示すコードは投稿されていませんが、リリースされる可能性のある ScoreLayer のこの問題は、いずれにせよ心に留めておくのに十分重要です。

于 2012-06-24T03:55:38.143 に答える
-2

のインターフェイス ファイルでそのプロトコル (デリゲート メソッド) を宣言しますHelloWorldLayer。次に、内部にデリゲート メソッドを配置しますScoreLayer.m

-(void)updateScore:(int)num {
    // Do something
}

現在のやり方では、間違ったクラスでプロトコルを宣言しています。

于 2012-06-24T03:55:38.363 に答える