2

私のアプリケーションは、UIView のカスタム サブクラスのインスタンスを作成し、水平方向に隣接して配置されたそれらのインスタンスを追加します。UIView クラスの新しいインスタンスが作成されたら、それを UIScrollView に追加してコンテンツサイズをリセットできます。私はそれから電話します [UIScrollView setContentOffset:(some point) animated:NO]。これはうまくいきます。問題は、上記のメソッドをアニメーションで呼び出したとき、つまり [UIScrollView setContentOffset:(some point) animated:YES] アプリケーションがクラッシュしたときです。コール スタックは次のようになります。

> #0    0x3145b870 in ___forwarding___ ()
> #1    0x313b6650 in _CF_forwarding_prep_0 ()
> #2    0x317d84a2 in -[UIAnimator stopAnimation:] ()
> #3    0x317d84a2 in -[UIAnimator stopAnimation:] ()
> #4    0x317d7f0e in -[UIAnimator(Static) _advance:withTimestamp:] ()
> #5    0x317d7e00 in -[UIAnimator(Static) _LCDHeartbeatCallback:] ()
> #6    0x3531d86e in CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) ()
> #7    0x3531d7c4 in CA::Display::IOMFBDisplayLink::callback(__IOMobileFramebuffer*,
> unsigned long long, unsigned long long, unsigned long long, void*) ()
> #8    0x33a56000 in IOMobileFramebufferVsyncNotifyFunc ()
> #9    0x36e3c60c in IODispatchCalloutFromCFMessage ()
> #10   0x31422f12 in __CFMachPortPerform ()
> #11   0x3142d522 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
> #12   0x3142d4c4 in __CFRunLoopDoSource1 ()
> #13   0x3142c312 in __CFRunLoopRun ()
> #14   0x313af4a4 in CFRunLoopRunSpecific ()
> #15   0x313af36c in CFRunLoopRunInMode ()
> #16   0x32888438 in GSEventRunModal ()
> #17   0x316b4cd4 in UIApplicationMain ()

Zombies を有効にすると、アプリケーションの出力は次のようになります。

*** -[__NSArrayM removeObject:]: message sent to deallocated instance 0x113dbb10

追加情報: UIScrollView のデリゲートは決して設定されません。ARCを使用しています。

4

2 に答える 2

3

問題が見つかりました。バックグラウンドスレッドからsetContentOffsetを呼び出すメソッドを呼び出していました。

BackgroundThread --> My random processing method --> Setup new UIView and add it to UIScrollView --> Call setContentOffset with animations

上記のフローによりクラッシュが発生します。メインスレッドから同じ処理メソッドを呼び出したところ、問題なく動作しました。

どうやらiOSはバックグラウンドスレッドから呼び出されるアニメーションを好まないようです。

于 2012-08-14T05:49:03.900 に答える
0

scrollView のビューの 1 つが解放されています。アニメーションをオフにすると、おそらくそれを「ジャンプ」します。オンにすると、システムは変更の一連の「スナップショット」を取得しようとし、1 つのビューにアクセスしようとするとブームダウンします。したがって、ゾンビを有効にして、メッセージを受け取っているオブジェクトのタイプを正確に見つけることができます。デバッガーでは、おそらくそのオブジェクトを「po」することができます。

別の方法としては、独自のテスト アニメーションを作成し、contentOffset をアニメーションなしのループで一度に 20 ピクセル移動し、いつクラッシュするかを確認します (必ずクラッシュします)。

于 2012-08-13T17:43:47.480 に答える