0

私はこの問題の解決策を数日間探していて、同様の投稿をいくつか見つけましたが、作業中のインスタンスが割り当て解除されるのを防ぐ方法についての決定的な答えを投稿した人はいないようです。うまくいけば、私はそれを見逃したか、誰かが私の脳を壊すのをやめるのを手伝ってくれるでしょう。

プロトコルLKNetworkingに準拠していることを宣言しているクラス( )があります。UIAlertViewDelegate現在はのサブクラスですがNSObject、試しUIResponderましたが、どちらも同じ問題が発生します。

問題は、UIAlertビューを作成し、デリゲートをに設定することselfです。UIAlertビューには[OK]と表示されますが、それLKNetworkingを呼び出したClassインスタンスは即座に割り当て解除され(NSLOGに表示されているように)、ボタンをクリックすると、メッセージは割り当て解除されたインスタンスに送信されます(LKNetworking alertView:clickedButtonAtIndex:]:message割り当て解除されたインスタンスに送信0x6e5ce40)

だから、私は.hファイルにそのようなプロパティを作成しようとしました:

@property (strong, nonatomic) LKNetworking *strongNetworkingProperty

次に、UIAlertViewのデリゲートをstrongNetworkingProperty ivarに設定しようとすると、メッセージがどこにも行かないように見えるので、それは良くありません。

アラートビューdelegateをに設定すると言われる回答をいくつか見ましnilたが、ユーザーの選択に応じてそれに応じて行動する必要があるため、それは私の目的全体を無効にします。

LKNetworkingアラートが呼び出されるメソッドとメソッドのサンプルコードは次のdelegateとおりです。

-(void)checkGameServerVersion: (float) serverGameVersion {
    if (serverGameVersion == GAMEVER) {
        NSLog(@"matched");
        // Continue flow here..
    } else {
        NSLog(@"not matched");
        //Game version does not match, end game, force upgrade 
        UIAlertView *oldVersion = [[UIAlertView alloc]initWithTitle:@"Ugrade Required" message:@"A new game version is available, Please update your game and try again." delegate:self cancelButtonTitle:@"Quit" otherButtonTitles: nil];
        [oldVersion show];
    }
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"button = %d",buttonIndex);
    if (buttonIndex == 0 ) {
        NSLog(@"pressed button 0, quitting gam");
    }
}
@end

任意の提案をいただければ幸いです!

ありがとう

4

1 に答える 1

6

LKNetworking を維持したい場合は、それへの参照を維持する必要があります。その何かは、LKNetworking オブジェクト自体である可能性があります。アラート ビューを作成するときに、strongNetworkingProperty = self を設定します。これにより、システムが LKNetworking オブジェクトの割り当てを解除できないようにする保持サイクルが作成されます。次に、alertView:clickedButtonAtIndex: で、strongNetworkingProperty を nil に設定して保持サイクルを中断します。

于 2012-04-17T01:34:35.857 に答える