我花了很多时间进行故障排除,为什么当我的视图控制器从堆栈中弹出时却没有为内存释放。这是我正在使用的悬崖笔记版本:

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


当我运行我的应用程序并继续返回该视图控制器并提交我的请求时,乐器/泄漏向我显示我有该视图控制器的多个实时实例。但是,当我注释掉所有图像/游戏/推送保存内容并仅弹出视图时,就会释放内存,并且我再也没有多个活动实例。

我还尝试过这样做,以确保在弹出ToRoot之前所有内容都已保存并完成。

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


不过,没有骰子。
您如何弹回根部而又不留任何假象?

最佳答案

访问self时,该块可能创建了一个保留周期。

尝试这个:

__unsafe_unretained YourClass* self_ptr = self;


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

关于ios - ios popToRoot使用块时不释放内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14060892/

10-09 10:00