当popviewcontroller时,消息发送到viewcontroller的deallocated实例

时间:2013-07-12 08:42:01

标签: ios uinavigationcontroller runtime-error catiledlayer cgpdfdocument

我正在使用带有导航控制器的ARC开发应用程序,第一个视图控制器有一个链接到ibaction的按钮,该按钮调用第二个视图控制器的推送。 在第二个viewcontroler中,一个按钮将视图控制器弹出到第一个视图控制器。当弹出有时我的应用程序崩溃时出现错误:“ - [Secondviewcontroller isKindOfClass:]:消息发送到解除分配的实例0xb181c00”。

这是我在推送秒的第一个视图控制器中的代码: (使用乐器,使用僵尸我会在此方法上收到僵尸消息)。

-(void)apriCassettoRivista {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    Secondviewcontroller *rivista = [[Secondviewcontroller alloc] init];
    [self.navigationController pushViewController:rivista animated:true];
}

检测到的错误是推送第二个视图控制器的方法..我无法理解这一点。 我认为问题出在第二个视图控制器中..可能吗?当弹出第二个时我使用以下代码:

-(IBAction)indietro:(id)sender {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self.navigationController popViewControllerAnimated:TRUE];
}

任何人都可以帮助我吗?这是僵尸消息的屏幕:http://vincentvega.net/iphone/schermo.png

在我的第二个控制器中,我也有观察者,但我在视图中销毁它们将消失在secondviewcontroller中。

更新 经过几次测试后我发现问题是由CATiledLayer里面的CGPDFPageRef渲染引起的。如果我禁用了这个功能,我的应用程序永远不会崩溃。

解决 解决方案是使用此函数在我的scrollview中将所有uiview catiledlayer的委托设置为nil:

-(void)buttavia {
    NSArray *subviews = [mainScrolla subviews];

    for (UIView *subview in subviews) {

        if ([subview isKindOfClass:[UIScrollView class]]) {

            //  Ho uno scrolla
            //
            NSArray *subviewsScrolla = [subview subviews];
            for (UIView *subviewScrolla in subviewsScrolla) {

                if ([subviewScrolla isKindOfClass:[UIView class]]) {

                    //  Ho una view nello scrolla
                    //
                    if (subviewScrolla) {
                        ((CATiledLayer *)subviewScrolla.layer).delegate = nil;
                        ((CATiledLayer *)subviewScrolla.layer).contents = nil;
                        [subviewScrolla removeFromSuperview];
                        [subviewScrolla.layer removeFromSuperlayer];
                    }
                }

            }

        }

    }
}

0 个答案:

没有答案