在什么情况下会发布'叫recur?

时间:2015-08-31 05:51:32

标签: ios objective-c automatic-ref-counting nsautoreleasepool

我有一个分段错误(SIGSEGV),其中包含以下堆栈跟踪:

Thread 6 Crashed:
0   libobjc.A.dylib                     objc_msgSend (in libobjc.A.dylib) + 16
1   CoreData                            -[NSManagedObject release] (in CoreData) + 160
2   libobjc.A.dylib                     object_cxxDestructFromClass(objc_object*, objc_class*) (in libobjc.A.dylib) + 148
3   libobjc.A.dylib                     objc_destructInstance (in libobjc.A.dylib) + 92
4   CoreData                            _PFDeallocateObject (in CoreData) + 28
5   MyApp                               -[Job dealloc] (in MyApp) (Job.m:113)
6   CoreData                            -[_PFManagedObjectReferenceQueue _queueForDealloc:] (in CoreData) + 272
7   CoreData                            -[NSManagedObject release] (in CoreData) + 160
8   CoreData                            -[_PFArray dealloc] (in CoreData) + 100
9   libobjc.A.dylib                     (anonymous namespace)::AutoreleasePoolPage::pop(void*) (in libobjc.A.dylib) + 564 

请注意dealloc类中的Job方法为空/无操作。它似乎是在代码转换为ARC之前的遗留残余。

在堆栈跟踪中,我感到奇怪的是,[NSMangedObject release]的调用导致在[NSManagedObject release]完成之前调用NSManagedObject。这给出了递归的外观,虽然我的猜测是第二次调用可能是某个其他object_cxxDestructFromClass实例并且没有发生实际的递归。

但是会发生什么情况呢?从链中的前一个方法的名称(Job),似乎运行时正在释放可能存在的任何类成员变量。那是对的吗?

ivar类确实有一个NSManagedObject字段,用于保留对另一个ivar实例的瞬态引用,因此当运行时尝试释放引用的实例时会发生此崩溃System.out.println("enter the initial balance");(它看起来已经发布了)?

0 个答案:

没有答案