奇怪的EXC_BAD_ACCESS错误(我认为)

时间:2014-05-22 14:13:04

标签: ios objective-c uitableview uiviewcontroller exc-bad-access

我有一个UITableViewCell,里面有几个UIImageView个。我已经为每个人添加了UITapGestureRecognizer,然后我会将消息发回给拥有的UIViewController以推送到新的UIViewController,并将UIImage传递给数据显示在新推出的UIViewController

以下是我用来执行此操作的代码:

- (void)imageViewTappedForImage:(UIImage *)image {
    MSSPictureDetailViewController *vc      = [self.storyboard instantiateViewControllerWithIdentifier:@"pictureDetailViewController"];
    vc.image                                = image;
    [self.navigationController pushViewController:vc animated:YES];
}

我到最后一行就好了,但是我一直得到一个EXC_BAD_ACCESS错误。

vc.image是一个强大的属性。如果我输入一个断点,我能想到要检查的每个变量都有一个实际值。

有没有人看到我失踪的东西?

更新 我看到的错误信息是EXC_BAD_ACCESS。

这是回溯:

* thread #1: tid = 0x33018e, 0x0287b0b2 libobjc.A.dylib`objc_msgSend + 14, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x77656982)
frame #0: 0x0287b0b2 libobjc.A.dylib`objc_msgSend + 14
frame #1: 0x016649b7 UIKit`-[UINavigationController _startCustomTransition:] + 895
frame #2: 0x016718f7 UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 688
frame #3: 0x016724e9 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57
frame #4: 0x017b30d1 UIKit`-[UILayoutContainerView layoutSubviews] + 213
frame #5: 0x0159a964 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
frame #6: 0x0287d82b libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #7: 0x0078845a QuartzCore`-[CALayer layoutSublayers] + 148
frame #8: 0x0077c244 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 380
frame #9: 0x0077c0b0 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 26
frame #10: 0x006e27fa QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 294
frame #11: 0x006e3b85 QuartzCore`CA::Transaction::commit() + 393
frame #12: 0x007a15b0 QuartzCore`+[CATransaction flush] + 52
frame #13: 0x015299bb UIKit`_UIApplicationHandleEventQueue + 13095
frame #14: 0x02ca377f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
frame #15: 0x02ca310b CoreFoundation`__CFRunLoopDoSources0 + 235
frame #16: 0x02cc01ae CoreFoundation`__CFRunLoopRun + 910
frame #17: 0x02cbf9d3 CoreFoundation`CFRunLoopRunSpecific + 467
frame #18: 0x02cbf7eb CoreFoundation`CFRunLoopRunInMode + 123
frame #19: 0x033d95ee GraphicsServices`GSEventRunModal + 192
frame #20: 0x033d942b GraphicsServices`GSEventRun + 104
frame #21: 0x0152bf9b UIKit`UIApplicationMain + 1225
* frame #22: 0x00029d6d IMR`main(argc=1, argv=0xbfffee58) + 141 at main.m:16

3 个答案:

答案 0 :(得分:1)

这个方法imageViewTappedForImage:是你传递给手势识别器的选择器吗?这可以解释这个问题。 gr传递本身作为该方法的参数,而不是它附加的视图。 gr有它作为一个属性的视图,所以这样修复(如果我的猜测是正确的,这是你的gr。触发的方法)......

- (void)imageViewTappedForImage:(UIGestureRecognizer *)gr {
    UIImageView *imageView = (UIImageView *)gr.view;
    MSSPictureDetailViewController *vc      = [self.storyboard instantiateViewControllerWithIdentifier:@"pictureDetailViewController"];
    vc.image                                = imageView.image;
    [self.navigationController pushViewController:vc animated:YES];
}

答案 1 :(得分:0)

哇,这个是一个很好的!

我最后尝试了几种不同的方式来调用我的MSSPictureDetailViewController,所有这些都失败了。

这使我发现我的错误与UITapGestureRecognizers无关,与哪个帖子调用我的转换无关,与UIImageView引用无关......等等。

我最终发生的事实是我在我的UIViewController中有一个自定义方法,声明如下:

- (IBAction)view;

在这一点上,答案对我来说非常明显,但最初并不是这样,所以我要在这里给后人发出警告:

请勿在UIVIEWCONTROLLER中声明一个名为view的方法!!!

事实证明,每次iOS尝试访问此UIViewController子类的view属性时,都会调用我的空方法。显然(并且可以理解),这使系统感到困惑,并且它不知道放在屏幕上的内容,因为它永远无法访问它所期望的UIView对象。

无论如何,改变

- (IBAction)view

- (IBAction)viewPicture

解决了一切。

然而,我有点惊讶,那就是压倒一切

@property(nonatomic,retain) UIView *view

- (IBAction)view

(将返回类型从UIView更改为void)没有抛出编译器错误(或至少发出警告)。

答案 2 :(得分:0)

追踪EXC_BAD_ACCESS的最佳方法是从编辑方案菜单启用Zombie Objects。启用后,您应该使用Zombie仪器配置应用程序。现在重现你的bug并查看分配面板。每当检测到僵尸时,就会出现一个红色标记,描述僵尸的位置,并为您提供有关谁负责的有用提示。

现在,您应该真正扩展您的问题,添加更多详细信息,您提供的信息我怀疑我们可以提供更多帮助。