来自IB的GestureRecognizers在模拟内存警告时崩溃应用程序

yro*_*roc 2 memory-leaks exc-bad-access objective-c uigesturerecognizer ios

我有一个从故事板中拉出的手势识别器,它工作正常,花花公子...

当我模拟低内存警告时除外.那时,它崩溃了错误:

[UISwipeGestureRecognizer retain]: message sent to deallocated instance 0x8627330
Run Code Online (Sandbox Code Playgroud)

为了让它不崩溃,我要做的是将手势识别器设置为一个强大的属性,并在viewdidload中将自动生成的集合注释为nil:

//[self setSwipeGestureRecognizer:nil];
Run Code Online (Sandbox Code Playgroud)

我随机得到了这个解决方案,我希望有人可以解释这里发生了什么?

Rob*_*Rob 5

迷人.当你第一次发布这个时,我假设你的代码有问题,但鉴于你的澄清评论,我决定自己尝试一下.我会遇到与你相同的行为.

具体来说,我在Interface Builder中创建了一个手势识别器,并将其链接到适当的IBAction并确认它工作正常,即使我从另一个视图控制器推送和弹出.但是,如果我在该辅助视图控制器处模拟内存警告,则在返回原始视图控制器后立即收到同样的崩溃.

这很容易弥补.看起来你有一个方法,或者你可以完全绕过Interface Builder,并在代码中创建自己的手势识别器,你就不会有这个问题,例如,

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.

    UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    [self.view addGestureRecognizer:recognizer];
    // [recognizer release]; // uncomment in non-ARC project
}
Run Code Online (Sandbox Code Playgroud)

如果您像这样手动创建它,则在模拟内存警告后返回到视图时不会出现崩溃.这就是你的解决方案.

幸运的是,在下一版Xcode和iOS的测试版中看起来已经得到了补救.