8

非常に奇妙なクラッシュが発生しています。これがバックトレースです。

* thread #1: tid = 0x2403, 0x3379516c CoreFoundation`CFHash + 8, stop reason = EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe)
    frame #0: 0x3379516c CoreFoundation`CFHash + 8
    frame #1: 0x33797a9c CoreFoundation`CFBasicHashRemoveValue + 1408
    frame #2: 0x337974ee CoreFoundation`CFDictionaryRemoveValue + 166
    frame #3: 0x3420988e Foundation`-[NSISEngine removeConstraintWithMarker:] + 562
    frame #4: 0x34211dbe Foundation`-[NSLayoutConstraint _removeFromEngine:] + 230
    frame #5: 0x35a954ec UIKit`-[UIView(UIConstraintBasedLayout) _layoutEngine_willRemoveLayoutConstraint:] + 44
    frame #6: 0x358488fc UIKit`__48-[UIScrollView _setAutomaticContentConstraints:]_block_invoke_0 + 148
    frame #7: 0x34208882 Foundation`-[NSISEngine withAutomaticOptimizationDisabled:] + 166
    frame #8: 0x35848838 UIKit`-[UIScrollView _setAutomaticContentConstraints:] + 116
    frame #9: 0x35848e6c UIKit`-[UIScrollView _rememberDependentConstraint:] + 112
    frame #10: 0x35a9e3ae UIKit`___updateViewDependenciesForConstraint_block_invoke_0 + 30
    frame #11: 0x35a954ba UIKit`_updateViewDependenciesForConstraint + 202
    frame #12: 0x35a953da UIKit`-[UIView(UIConstraintBasedLayout) _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:] + 154
    frame #13: 0x35a95534 UIKit`-[UIView(UIConstraintBasedLayout) _tryToAddConstraintWithoutUpdatingConstraintsArray:roundingAdjustment:mutuallyExclusiveConstraints:] + 36
    frame #14: 0x3567c2e0 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 376
    frame #15: 0x356d34fe UIKit`-[UIScrollView _didMoveFromWindow:toWindow:] + 50
    frame #16: 0x3567c5c6 UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 1118
    frame #17: 0x35676e52 UIKit`-[UIView(Hierarchy) _postMovedFromSuperview:] + 138
    frame #18: 0x3565e7dc UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 1300
    frame #19: 0x3565e2c2 UIKit`-[UIView(Hierarchy) addSubview:] + 30
    frame #20: 0x356f68e8 UIKit`-[UITransitionView transition:fromView:toView:removeFromView:] + 972
    frame #21: 0x35937618 UIKit`__91-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:]_block_invoke_0238 + 388
    frame #22: 0x357499b8 UIKit`-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 4824
    frame #23: 0x357b9814 UIKit`-[UIViewController _dismissViewControllerWithTransition:from:completion:] + 1708
    frame #24: 0x357057c4 UIKit`-[UIViewController dismissViewControllerWithTransition:completion:] + 912
    frame #25: 0x000ccd40 Capture`-[INFTagSearchViewController cancelButtonTouched:](self=0x1f09ed50, _cmd=0x001b9d5f, sender=0x1e0265c0) + 76 at INFTagSearchViewController.m:48
    frame #26: 0x357470c4 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 72
    frame #27: 0x35747076 UIKit`-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 30
    frame #28: 0x35747054 UIKit`-[UIControl sendAction:to:forEvent:] + 44
    frame #29: 0x3574690a UIKit`-[UIControl(Internal) _sendActionsForEvents:withEvent:] + 502
    frame #30: 0x35746e00 UIKit`-[UIControl touchesEnded:withEvent:] + 488
    frame #31: 0x3566f5f0 UIKit`-[UIWindow _sendTouchesForEvent:] + 524
    frame #32: 0x3565c800 UIKit`-[UIApplication sendEvent:] + 380
    frame #33: 0x3565c11a UIKit`_UIApplicationHandleEvent + 6154
    frame #34: 0x373655a2 GraphicsServices`_PurpleEventCallback + 590
    frame #35: 0x373651d2 GraphicsServices`PurpleEventCallback + 34
    frame #36: 0x33829172 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34
    frame #37: 0x33829116 CoreFoundation`__CFRunLoopDoSource1 + 138
    frame #38: 0x33827f98 CoreFoundation`__CFRunLoopRun + 1384
    frame #39: 0x3379aebc CoreFoundation`CFRunLoopRunSpecific + 356
    frame #40: 0x3379ad48 CoreFoundation`CFRunLoopRunInMode + 104
    frame #41: 0x373642ea GraphicsServices`GSEventRunModal + 74
    frame #42: 0x356b0300 UIKit`UIApplicationMain + 1120
    frame #43: 0x000a297c Capture`main(argc=1, argv=0x2fd60cfc) + 116 at main.m:16
    frame #44: 0x3bb2bb20 libdyld.dylib`start + 4

フレーム25が私のコードが行う唯一の呼び出しであり、そのcancelButtonTouchedように見えることに気付くでしょう。

- (IBAction)cancelButtonTouched:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}

何が起こっているのか途方に暮れています。これまでにこのような問題が発生したことはありません。システムコールに基づくと、自動レイアウトの問題のようです。クラッシュが発生する前に、viewWillApperが提示ビューコントローラーで呼び出されることを確認したので、提示ビューのレイアウト中に発行されていると思います。

この問題を特定のレイアウト制約に絞り込む方法についてのアイデアはありますか?または他のアイデアはありますか?

これは一部のデバイスで再現可能ですが、他のデバイスではほとんど発生しません。したがって、断続的です。

アップデート

ブレークポイントのスクリーンショット。

ここに画像の説明を入力してください

アップデート2

したがって、これは間違いなく、presentingViewController2レベルの深さ([self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil])を却下することで問題になりますが、明らかに望ましい結果ではありません。1レベルだけ戻りたいと思います。これはさらに、ビューの「再レイアウト」に問題があると私に信じさせます。

4

4 に答える 4

7

まったく同じかどうかはわかりませんが、このようなことを覚えているようです。私の場合、すでにサブビューであるビューを使用してaddSubview:(またはinsertSubview:...)を呼び出したことが原因でした。通常、UIViewはそれを処理すると思いますが、自動レイアウトでは、一部の関連情報が他の場所に2回追加される可能性があり、その関連情報をクリーンアップしようとするとクラッシュする可能性があります。私の場合、解決策は、サブビューを1回だけ追加することで、このクラッシュ(またはとにかく私の同様のクラッシュ)はなくなりました。

于 2013-05-17T18:46:04.373 に答える
4

Carl Lindbergのアイデアに基づいて、次のiOSカテゴリを準備して使用しましたが、クラッシュすることはもうありません。

UIView + AddSubviewWithRemovingFromParent.h

#import <UIKit/UIKit.h>

@interface UIView (AddSubviewWithRemovingFromParent)

- (void)addSubviewWithRemovingFromParent:(UIView *)view;

@end

UIView + AddSubviewWithRemovingFromParent.m

#import "UIView+AddSubviewWithRemovingFromParent.h"

@implementation UIView (AddSubviewWithRemovingFromParent)

- (void)addSubviewWithRemovingFromParent:(UIView *)view {
    if (view.superview != nil) {
        [view removeFromSuperview];
    }
    [self addSubview:view];
}

@end

これで、次のようなaddSubviewメソッドの代わりに、addSubviewWithRemovingFromParentメソッドを使用してsubViewを追加できます。

UITableViewCell *cell = [[UITableViewCell alloc] init];
[cell.contentView addSubviewWithRemovingFromParent:<viewToAdd>];

要約すると:

  1. アプリがクラッシュしているコントローラーでaddSubViewのすべての参照を検索します
  2. カテゴリUIView+AddSubviewWithRemovingFromParent.hをインポートします
  3. addSubViewの代わりにメソッドaddSubviewWithRemovingFromParentを使用します
于 2013-11-06T17:02:38.890 に答える
1

私の場合、このクラッシュは、ストーリーボードにView Controllerがあり、ファイル所有者と同じViewControllerを使用してNIBからビューコンテンツをロードしたときに発生しました。これは通常は正常に機能しますがview、ストーリーボードとNIBの両方にアウトレットを設定したため、iOS6の「サブビューを2回追加する」バグが発生しました。NIBのビューアウトレットをクリアすることにより、すべてが修正されました。

于 2014-05-07T20:56:37.853 に答える
0

私は同じ問題を抱えていました。
同じ問題が発生します。2つのビューコントローラーをモーダルに重ねて表示し、最初のビューコントローラーに戻したい場合です。最初に表示されたビューの自動レイアウトを無効にすると、問題が解決するだけです。
あなたの場合、self.presentingviewcontroller
残念ながら私はそれをさらに絞り込むことができませんでした。

于 2013-07-30T10:13:19.337 に答える