我有一个分段错误(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");
(它看起来已经发布了)?