6

私はしばらくの間、この (やや) ランダムなバグに対処してきましたが、問題がわかりません。コンテキスト: マスター ビュー内に UINavigationController を持つ UISplitView iPad アプリを作成しています。

赤がメインメニュー、緑がサブメニュー、紫がメインコンテンツ 赤がメイン メニュー、緑がサブメニュー、紫がメイン コンテンツ。

この UINavigationController は、垂直メニューを表示するためのスペースが必要なため、マスター ビュー全体を埋めません。ユーザーが垂直サイド メニューのボタンを選択すると、UINavigationController に新しい何かが設定され、オプション付きの UITableView が表示されます。すべてのメニュー選択で私がしていることは次のとおりです。

[self.subMenu setViewControllers:@[subMenuViewController] animated:YES];

何が起こるかというと、メニューの履歴を保持する必要がないので、毎回新しいルート ビュー コントローラーを subMenu に設定するだけです。

問題は、デバイスの向きをいじり始めたときです。明確なパターンはありませんが、回転時にアプリがクラッシュすることがあります。これを Instruments で実行すると、次のようになります。

167 Zombie      -1  00:32.101.527   UIKit   -[UITableView _spacingForExtraSeparators]

そして興味深いのは、subMenu の前のルート ビュー コントローラーでアクセス不良が発生することです。そのため、「Events」をタップしてから「Podcasts」をタップすると、「EventsViewController」にアクセスしようとすると、不正なアクセスが発生します。

したがって、subMenu UINavigationController のルート ビュー コントローラーを置き換える方法に何か問題があると思いますが、それが何であるかはわかりません。新しいルート ビュー コントローラーを設定する前に、現在のルート ビュー コントローラーが解放されていることを確認する必要があるのでしょうか。

どんな助けでも大歓迎です。:)

4

2 に答える 2

4

システム ライブラリのコードが正しく設定されていないためにクラッシュすることは珍しくありません。これは、UIWindow、UIApplicationMain、またはそのコンテンツ ビュー、またはビュー コントローラー インスタンスが保持されていないか、何らかの形で解放された可能性があります。

コントローラーがまだ存在しない場合、その shouldrotate メソッドは役に立ちません。

これは、解放されたオブジェクトを特定するためです。

特に厄介な問題については、(ログに記録して super を呼び出す) release、retain、および dealloc メソッドを自分の疑わしいクラスに追加して、何が解放されているかを確認できます。-retaincount をログに記録して追跡します (これは診断目的でのみ使用します)。

または、これを試して、-[UIDevice setOrientation:] にブレークポイントを設定し、デバッガーでコードをステップ実行することもできます。

デバッグを容易にするために、デバッガー コンソールに call (void)instrumentObjcMessageSends(YES) と入力して、objc_msgSends の /tmp/ へのログ記録を開始し、実行を続行すると、送信されたすべてのメッセージがクラッシュまで追跡されます。

于 2013-11-14T05:32:54.920 に答える
2

したがって、最初に、メソッドを実装する必要がありますwillRotateToInterfaceOrientation(willAnimateToInterfaceOrientationこれらdidRotateToInterfaceOrientationのメソッドの実際のシグネチャを確認してください) UITableView

これらの各メソッドで、テーブル ビューの dataSource とデリゲートを確認します。このクラッシュは、デリゲートまたはテーブル ビューのデータ ソースのリリースが原因であると考えられます。

また、ローテーション中にどのテーブル ビュー デリゲート/データソース メソッドが呼び出されるかを確認する必要があります。

最後に、 の古いインスタンスを破棄し、subMenuViewControllerそれらが親ビュー コントローラーから適切に削除されていることを確認してください。

于 2013-11-19T12:14:55.473 に答える