5

いくつかの ARC コードをデバッグしようとしていますが、特定のクラスのオブジェクトがいつ自動解放プールに追加されたのか (それが実際に自動解放されたときではなく) を知ることができれば、非常に役に立ちます。

これは、たとえばブレークポイントで可能ですか? または、「autorelease」メソッドを上書きしてブレークポイントを配置することによってですか? 助言がありますか?

- 編集 -

問題は、UIView のカスタム サブクラスがバックグラウンド スレッドで自動解放される場所で、まれにクラッシュが発生することです。これは、バックグラウンド スレッドで UIView の割り当てを解除できないためにクラッシュします。トレースは次のようになります。

0    libsystem_kernel.dylib  __pthread_kill + 8
1    libsystem_c.dylib   pthread_kill + 54
2    libsystem_c.dylib   abort + 94
3    libc++abi.dylib     abort_message + 46
4    libc++abi.dylib     default_terminate() + 24
5    libobjc.A.dylib     _objc_terminate + 146
6    libc++abi.dylib     safe_handler_caller(void (*)()) + 76
7    libc++abi.dylib     operator delete(void*)
8    libc++abi.dylib     __cxa_throw + 122
9    libobjc.A.dylib     objc_exception_throw + 94
10   CoreFoundation  +[NSException raise:format:]
11   Foundation  -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 90
12   MYAPP   MySuperclass.m line 156 -[MySuperclass dealloc]
13   MYAPP  MyClass.m line 41 -[MyClass dealloc]
14 ...   libobjc.A.dylib     _objc_rootRelease + 36
15   libobjc.A.dylib     objc_release + 38
16   libobjc.A.dylib     (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 224
17   libobjc.A.dylib     _objc_autoreleasePoolPop + 12
18   CoreFoundation  _CFAutoreleasePoolPop + 18
19   libdispatch.dylib   _dispatch_worker_thread2 + 338
20   libsystem_c.dylib   _pthread_wqthread + 294
4

1 に答える 1

7

これはあなたの問題には役立たないかもしれませんが、元の質問に答えると思います:

シンボリック ブレークポイントを追加して[NSObject autorelease]から、クラスに一致する条件を設定できます。デバイスで実行している場合$r0、受信オブジェクトへのポインターを保持する必要があります。条件を機能させるには、いくつかのキャストを行う必要があります。autoreleasepool に an が追加さ(BOOL)[(id)$r0 isKindOfClass:[NSArray class]]れるたびに中断します。NSArrayデバッガーはすべての自動解放で中断し、状態をチェックする必要があるため、すべてが非常に遅く実行されることに注意してください。

シンボリック ブレークポイントを追加する

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-10-24T22:52:07.277 に答える