0

ビューコントローラがスタックからポップされたときにメモリ用に解放されない理由のトラブルシューティングに多くの時間を費やしました。これが私が取り組んでいるもののクリフノートバージョンです:

- (IBAction)submitTurn:(UIButton *)sender {
    ...
    [imageFile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error){
        if (!error){
            ...
            [game saveEventually];
            ...
            [push sendPushInBackground];
            }
        }
        else{
            NSLog(@"Error submitting turn: %@ %@", error, [error userInfo]);
            [[[UIAlertView alloc] initWithTitle:@"Error Saving Game" message:@"Try again later." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] show];
        }
    } progressBlock:nil];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

アプリを実行してこのViewControllerに戻り、順番を送信し続けると、instruments/leaksはこのViewControllerの複数のライブインスタンスがあることを示しています。ただし、すべての画像/ゲーム/プッシュ保存をコメントアウトしてビューをポップすると、メモリが解放され、複数のライブインスタンスが存在することはありません。

また、poppingToRootの前にすべてが保存され、終了したことを確認するためにこれを試しました。

- (IBAction)submitTurn:(UIButton *)sender {
    ...
    [imageFile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error){
        if (!error){
            ...
            [game saveEventually:^(BOOL succeeded, NSError *error) {
                ...
                    [push sendPushInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                        [self.navigationController popToRootViewControllerAnimated:YES];
                    }];
                }
            }];
        }
        else{
           ...
        }
    } progressBlock:nil];
}

それでも、サイコロはありません。アーティファクトを残さずにルートに戻るにはどうすればよいですか?

4

1 に答える 1

1

にアクセスするときに、ブロックによって作成された保持サイクルがある可能性がありますself

これを試して:

__unsafe_unretained YourClass* self_ptr = self;

ブロックに入る前、およびブロック内でのself_ptr代わりに使用しselfます。

于 2012-12-27T21:15:24.103 に答える