我正在尝试调试一些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
答案 0 :(得分:7)
这可能对您的问题没有帮助,但我认为它回答了您原来的问题:
您可以在[NSObject autorelease]
上添加符号断点,然后设置条件以匹配您的班级。如果您在设备$r0
上运行应该保持指向接收对象的指针。您需要进行一些强制转换以使条件有效:(BOOL)[(id)$r0 isKindOfClass:[NSArray class]]
每当NSArray
添加到autoreleasepool时就会中断。请注意,一切都将运行得非常慢,因为调试器必须在每次自动释放时中断并检查条件。