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