【问题标题】:Program crashes when segueing back and dispatch queue has animation method后退和调度队列有动画方法时程序崩溃
【发布时间】:2012-06-01 01:16:15
【问题描述】:

好的,所以我有一个UITableView,并且将项目选择了一个项目,以显示一个新视图控制器以显示图像(UiscrollView的内部)。图像开始从 prepareforsegue 的 dispatch_queue 中下载。需要明确的是,我正在主队列中进行所有 UI 更新。问题是,如果我足够快地点击后退按钮,那么我的程序会因 exc_bad_address 而崩溃。我认为问题必须处理 zoomToRect 动画:是的,因为当我将动画设置为 NO 时,我无法让它崩溃。加上下面的调用堆栈处理动画。解决此问题的最佳方法是什么,是否有更好的方法来完成我需要做的事情?

在调试问题时也会打印“块已完成”,然后很快就会崩溃。

stack trace

这里是调用的方法。它在 prepareForSegue 中目标控制器的 setter 中调用。

-(void) updateDisplay {
dispatch_queue_t queue = dispatch_queue_create("Load Flickr Photo", NULL);

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:spinner];
    [spinner startAnimating];

    dispatch_async(queue, ^{

        UIImage *image = [FlickrFetcher imageForPhoto:self.currentPhoto format:FlickrPhotoFormatLarge];

        dispatch_async(dispatch_get_main_queue(), ^{

            self.navigationItem.rightBarButtonItem = nil;
            self.imageView.image = image;
            self.title = [FlickrFetcher titleForPhoto:self.currentPhoto];    
            CGAffineTransform transform = CGAffineTransformMakeScale(1.0, 1.0);
            self.imageView.transform = transform;

            self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);

            self.scrollView.maximumZoomScale = 4.0;
            self.scrollView.minimumZoomScale = .2;
            self.scrollView.zoomScale = 1;
            self.scrollView.contentSize = self.imageView.bounds.size;

            //i think problem is here
            [self.scrollView zoomToRect:self.imageView.frame animated:YES];
            NSLog(@"Block completed");
        });
    });
}

【问题讨论】:

    标签: objective-c ios5 uiscrollview grand-central-dispatch segue


    【解决方案1】:

    我认为一个潜在的问题可能是,当您的块保留您的 self 视图控制器时,它在队列中处于活动状态......

    如果您发送-zoomToRect:animated:NO,该块仍将处于活动状态并在调用时阻塞,从而确保所有对象在内存中仍然有效。

    如果您发送-zoomToRect:animated:YES,该块将退出,可能会产生一个竞争条件,您的视图控制器将被释放,因为当您返回 segue 时,情节提要也会释放您的视图控制器,使其有效保留计数为零.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2015-03-12
      • 2013-05-14
      相关资源
      最近更新 更多