【问题标题】:Crash after dismissing an UIViewController关闭 UIViewController 后崩溃
【发布时间】:2014-11-10 16:47:03
【问题描述】:

不久之后,我的应用程序出现问题,一旦我关闭特定的 UIViewController,应用程序就会崩溃,并出现 Tread 1:breakpoint 1.1 7.1。

我已将问题缩小到放置在已关闭视图中的“容器视图”。我注意到首先释放了主控制器,然后是容器视图控制器,但看不到问题所在。我不确定这个问题是什么时候出现的,因为我几天都在处理特定的界面问题,并且从未使用过“导航返回”选项。

我知道上面的描述很模糊,但是任何关于如何调试可能原因的建议都非常受欢迎,因为我在这个阶段已经花了几个小时。

#0  0x00000001954440a8 in objc_exception_throw ()
#1  0x0000000184d05d88 in +[NSException raise:format:] ()
#2  0x0000000185b59f00 in NSKVODeallocate ()
#3  0x0000000184be5378 in CFRelease ()
#4  0x0000000184bf1938 in -[__NSArrayM dealloc] ()
#5  0x000000019545d724 in (anonymous namespace)::AutoreleasePoolPage::pop(void*) ()
#6  0x0000000184be8f94 in _CFAutoreleasePoolPop ()
#7  0x0000000184cbb750 in __CFRunLoopRun ()
#8  0x0000000184be91f4 in CFRunLoopRunSpecific ()
#9  0x000000018dd775a4 in GSEventRunModal ()
#10 0x000000018951a784 in UIApplicationMain ()
#11 0x00000001000cdc04 in main at /Users/Luuk/Documents/Xcode development/idoms-portal/iDoms/main.m:14
#12 0x0000000195ab2a08 in start ()

编辑: 我已将其缩小到将容器链接到视图控制器:

@interface DOPrototypeViewController : UIViewController <DOContentSizeCallback> {

    @protected
    DOMediaPlayerHelper* _mediaPlayerHelper;
    __weak NSString* _viewTitle;

    IBOutlet UIBarButtonItem *_previousPageBttn;
    IBOutlet UIBarButtonItem *_nextPageBttn;

    __weak IBOutlet UIView* _contentContainer;
    __weak IBOutlet UIScrollView* _scrollView;
}

@property (nonatomic, weak)  NSString* viewTitle;;

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint;

一旦链接 IB 中的容器,就会出现问题。如上所述,似乎首先卸载了 DOPrototypeViewController,然后才是 contentContainer 控制器。它必须与返回到我感觉的 contentContainer 的父视图的链接有关。

【问题讨论】:

  • 崩溃的错误是什么?发布相关代码和相关崩溃日志详细信息(堆栈跟踪和错误)。
  • “一旦我解除分配” 解除分配?你应该永远打电话给dealloc
  • 抱歉,我关闭了视图控制器,并调用了 dealloc。
  • 我想我解决了,它是一个 [[self view] addObserver:self forKeyPath:@"frame" options:0 context:nil];不过,我之前确实认为是这样,但并没有解决问题,而是我完全重建了界面,几乎没有崩溃。

标签: ios objective-c dealloc


【解决方案1】:

我以前遇到过这种崩溃。通常,一条消息被发送到 A: 不再存在的对象。 B:不识别选择器。

从查看堆栈跟踪开始。看看坠机前的最后几个电话是什么。这通常会为您指明正确的方向。

此外,如果您遇到问题,请在此处发布崩溃日志和堆栈跟踪。

【讨论】:

  • 获得良好堆栈跟踪的最佳方法是什么?它没有给出任何有意义的东西。我会把它贴在上面。
  • 尝试为所有异常添加断点。有时有效。
  • 我确实有,但它不会触发。这是我发现 Xcode/Objective-C 最难的地方,有时很难弄清楚。
【解决方案2】:

这是一个参考。我添加了一个观察者 [[self view] addObserver:self forKeyPath:@"frame" options:0 context:nil];在两个控制器中,虽然我修复了一个,但从未见过第二个,也没有将其移除。

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2012-04-03
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多