Zombie对象,requireGestureRecognizerToFail,为什么?

时间:2014-03-30 04:00:39

标签: ios objective-c nszombie

我有两个VC,它们都有一个uicollectionviews,其中一个(称之为VC1)我添加了一个

UILongPressGestureRecognizer *lpgr
= [[UILongPressGestureRecognizer alloc]
   initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = .8; //seconds
lpgr.delegate = self;
[self.collectionView addGestureRecognizer:lpgr];
// Make the default gesture recognizer wait until the custom one fails.
for (UIGestureRecognizer* aRecognizer in [self.collectionView gestureRecognizers]) {
    if ([aRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
        [aRecognizer requireGestureRecognizerToFail:lpgr];
}

现在,通过应用程序生命周期,用户可以从此VC1切换到另一个VC2。 在那种情况下,我遇到了崩溃,如果我加载应用程序并转到VC2并且从未点击过VC1,这种情况永远不会发生。因此,在失去宝贵的时间找出如何调试这个后,我在仪器中运行了僵尸并发现了这条线

  [aRecognizer requireGestureRecognizerToFail:lpgr];

问题是什么,虽然这一行在

viewdidload 
VC1的

,如果我从VC1移动到VC2,则会调用!!

我禁用了该段,我的代码工作正常,我只是不知道为什么会发生这种情况!

1 个答案:

答案 0 :(得分:0)

您不应该为对象本身创建依赖关系。 正如您已经将一个手势识别器 lpgr 添加到collectionview中,在for循环中,可以创建 lpgr 本身的错误依赖关系。

像这样改写它。

// Make the default gesture recognizer wait until the custom one fails.
for (UIGestureRecognizer* aRecognizer in [self.collectionView gestureRecognizers]) {
    if ([aRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
        [aRecognizer requireGestureRecognizerToFail:lpgr];
}

[self.collectionView addGestureRecognizer:lpgr];