objective-c - IB 的 GestureRecognizers 在模拟内存警告时导致应用程序崩溃

标签 objective-c ios memory-leaks uigesturerecognizer exc-bad-access

我有一个从 Storyboard 中提取的手势识别器,它运行良好且花哨......

除了当我模拟内存不足警告时。此时,它崩溃并出现错误:

[UISwipeGestureRecognizer retain]: message sent to deallocated instance 0x8627330

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

//[self setSwipeGestureRecognizer:nil];

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

最佳答案

令人着迷。当您第一次发布此内容时,我假设您的代码存在一些问题,但考虑到您的澄清评论,我决定自己尝试一下。我也经历过和你一样的行为。

具体来说,我在 Interface Builder 中创建了一个手势识别器,并将其链接到适当的 IBAction 并确认它工作正常,即使我从另一个 View Controller 推送和弹出也是如此。但是,如果我在辅助 View Controller 处模拟内存警告,那么在返回原始 View Controller 后,我会立即收到与您相同的崩溃信息。

很容易修复。看起来您有一种方法,或者您可以完全绕过 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
}

如果您像这样手动创建它,则在模拟内存警告后返回 View 时不会发生崩溃。这就是你的解决方案。

幸运的是,看起来这个问题已经在下一版 Xcode 和 iOS 的测试版中得到了解决。

关于objective-c - IB 的 GestureRecognizers 在模拟内存警告时导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11279820/

相关文章:

ios - 为什么允许在实现内部的@interface中重写ivar,但是具有这种奇怪的行为?

iphone - NSObjCMessageLoggingEnabled 与 iPhone 3.0

ios - 为什么在 View Controller 被取消初始化并导致 SIGABRT 或 EXC_BAD_ACCESS 后观察者还活着?

android - Eclipse Memory Analyzer 主饼图中的 Remainder 是多少?

PHP算法大数组内存问题

iphone - 具有两种不同字体颜色的 UILabel

ios - UIButton 背景图片可以支持 Dynamic Type 吗?

ios - 从 fabric 迁移到 Firebase 时,您的一个或多个项目在链接时遇到错误

c - 链表删除函数中,删除节点是否需要使用free?

objective-c - 关于 CC_SHA256 objective-c 的一些信息