ios popToRoot在使用块时不释放内存

时间:2012-12-27 20:29:35

标签: ios objective-c-blocks poptoviewcontroller

我已经花了很多时间来解决为什么当我的视图控制器从堆栈中弹出时我的视图控制器没有被释放。这是我正在使用的悬崖版本:

- (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];
}

当我运行我的应用程序并继续回到此视图控制器并提交我的回合时,仪器/泄漏显示我有这个视图控制器的多个实时实例。但是,当我注释掉所有图像/游戏/推送保存并只是弹出视图时,内存就会被释放,而且我从来没有多个实时实例。

我也试过这个以确保在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];
}

仍然没有骰子。 如何在没有留下文物的情况下弹回根?

1 个答案:

答案 0 :(得分:1)

访问self时,您可能有一个由块创建的保留周期。

试试这个:

__unsafe_unretained YourClass* self_ptr = self;

在进入区块之前,在区块内使用self_ptr代替self