StoryBoards を使用するプロジェクトがあり、ルート ビュー コントローラーに表示UISearchDisplayController
される のコンテキストで使用されます。UINavigationController
新しいView Controllerをスタックにプッシュすると、シミュレートされたメモリ警告が発生します(または実際にメモリ不足の警告が表示されます)。前のビュー コントローラーは、そのビューを正常にアンロードします。ただし、スタックから 2 番目のビュー コントローラーをポップすると、EXC_BAD_ACCESS
. NSZombies をオンにすると、次のことがわかりました。
[UISearchDisplayController 保持]: 割り当て解除されたインスタンス 0xb13aa30 に送信されたメッセージ
私は(少なくとも私のコードでは)そのメッセージをに送信していませんUISearchDisplayController
。プログラム的に言えば、私はそれで何もしていません。ブレーク ポイントviewDidLoad
は、最初のビュー コントローラーの にさえ入っていないことを示しています。
しかし、何か奇妙なことがあります: 笑いと笑いのためにretain
、viewDidLoad
何が起こるかを確認するためだけに、クラッシュが発生しないことを確認するために、. ただし、私のUISearchDisplayController
インスタンスはnil
.
バックトレースを行ったところ、次の出力が得られました。
#0 0x01e30e1e in ___forwarding___ ()
#1 0x01e30ce2 in __forwarding_prep_0___ ()
#2 0x01dd1490 in CFRetain ()
#3 0x01eb69c0 in +[__NSArrayI __new::] ()
#4 0x01e0a00a in -[__NSPlaceholderArray initWithObjects:count:] ()
#5 0x01e34f52 in +[NSArray arrayWithObjects:count:] ()
#6 0x01e5e084 in -[NSDictionary allValues] ()
#7 0x01035272 in -[UINib instantiateWithOwner:options:] ()
#8 0x00edce2c in -[UIViewController _loadViewFromNibNamed:bundle:] ()
#9 0x00edd3a9 in -[UIViewController loadView] ()
#10 0x00edd5cb in -[UIViewController view] ()
#11 0x00edd941 in -[UIViewController contentScrollView] ()
#12 0x00eef47d in -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] ()
#13 0x00eef66f in -[UINavigationController _layoutViewController:] ()
#14 0x00eef93b in -[UINavigationController _startTransition:fromViewController:toViewController:] ()
#15 0x00ef03df in -[UINavigationController _startDeferredTransitionIfNeeded] ()
#16 0x00ef16cb in _popViewControllerNormal ()
#17 0x00ef196c in -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:] ()
#18 0x0b446e82 in -[UINavigationControllerAccessibility(SafeCategory) _popViewControllerWithTransition:allowPoppingLast:] ()
#19 0x00ef0b10 in -[UINavigationController popViewControllerAnimated:] ()
#20 0x00ef297d in -[UINavigationController navigationBar:shouldPopItem:] ()
#21 0x00e7dabe in -[UINavigationBar _popNavigationItemWithTransition:] ()
#22 0x00e7da49 in -[UINavigationBar popNavigationItemAnimated:] ()
#23 0x0b42208c in -[UINavigationBarAccessibility(SafeCategory) popNavigationItemAnimated:] ()
#24 0x00e80507 in -[UINavigationBar _handleMouseUpAtPoint:] ()
#25 0x00e8074c in -[UINavigationBar touchesEnded:withEvent:] ()
#26 0x00e3fa30 in -[UIWindow _sendTouchesForEvent:] ()
#27 0x00e3fc56 in -[UIWindow sendEvent:] ()
#28 0x00e26384 in -[UIApplication sendEvent:] ()
#29 0x00e19aa9 in _UIApplicationHandleEvent ()
#30 0x02d37fa9 in PurpleEventCallback ()
#31 0x01e9e1c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#32 0x01e03022 in __CFRunLoopDoSource1 ()
#33 0x01e0190a in __CFRunLoopRun ()
#34 0x01e00db4 in CFRunLoopRunSpecific ()
#35 0x01e00ccb in CFRunLoopRunInMode ()
#36 0x02d36879 in GSEventRunModal ()
#37 0x02d3693e in GSEventRun ()
#38 0x00e17a9b in UIApplicationMain ()
#39 0x00002b72 in main (argc=1, argv=0xbffff620)
そこには本当に興味深いものは何もないように見えます (今までにありましたか? :P) そして、すべて Apple のものの内部にあるようです。この問題を解消する方法についてのアイデアはありますか?
更新: View ControllerとSearch Display Controllerのプロパティ間の接続を削除しても、独自の接続を作成IBOutlet
してもクラッシュします。おそらく悪いバグ?
更新 2:UISearchDisplayController
(ストーリーボードではなく)の独自のインスタンスをプログラムで作成し、で作成するとviewDidLoad
、すべてが想定どおりに機能します。
更新 3:ストーリーボードを使用した新しいプロジェクトで、この問題を一貫して再現できます。バニラのペン先を使って同じことをしたところ、すべてが想定どおりに機能しました。ただし、ストーリーボードとセグエを使用して同じものをセットアップすると、実際のプロジェクトと同じように爆発します。:(
RECAP : この問題を再現する手順は次のとおりです。
- ストーリーボードでView Controllerを作成します
UISearchDisplayController
- ナビゲーション スタックに新しいビュー コントローラーをプッシュする
- メモリ不足の警告を発生させる
- コントローラーをスタックからポップする
- カブーム!
viewDidLoad
この時点では、最初のビュー コントローラで呼び出されることさえありません。Apple のコードは、その前に爆発します。