【发布时间】:2009-05-08 21:31:33
【问题描述】:
我正在编写一个简单的 ObjC2.0/Cocoa 应用程序,但我遇到了崩溃.. 不熟悉 Cocoa 或 ObjC,我不知道为什么..
导致问题的代码是TableListCon.m
当我将一个文件夹拖到 NSTableView 上时,它会调用 addDirectoryToList - 它会递归地遍历此目录中包含的所有文件,并在每个文件上调用 addFileToList。
当我将单个文件拖到 tableview 上时,它会直接调用 addFileToList。这可以正常工作,但在调试器控制台中显示以下消息:
tvnamergui(2612) malloc: *** error for object 0x144ab0: double free
*** set a breakpoint in malloc_error_break to debug
或者,如果我拖放一个文件夹,没有这样的消息,它会直接拖放到 GDB,并带有以下回溯:
(gdb) bt
#0 0x95cee688 in objc_msgSend ()
#1 0x921e2e4f in NSPopAutoreleasePool ()
#2 0x917b4b10 in NSCoreDragReceiveProc ()
#3 0x95f9e1b0 in DoDropMessage ()
#4 0x95f9dc11 in CoreDragMessageHandler ()
#5 0x960f0d21 in __CFMessagePortPerform ()
#6 0x961128e8 in CFRunLoopRunSpecific ()
#7 0x96112cd8 in CFRunLoopRunInMode ()
#8 0x924892c0 in RunCurrentEventLoopInMode ()
#9 0x92489012 in ReceiveNextEventCommon ()
#10 0x92488f4d in BlockUntilNextEventMatchingListInMode ()
#11 0x914e0d7d in _DPSNextEvent ()
#12 0x914e0630 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
#13 0x914d966b in -[NSApplication run] ()
#14 0x914a68a4 in NSApplicationMain ()
#15 0x000022a0 in main (argc=1, argv=0xbffff74c) at /Users/dbr/Desktop/tvnamergui/main.m:13
更奇怪的是,如果我先拖动单个文件,我会收到 double free 错误,但随后我可以放下文件夹而不会崩溃(一切正常)
当[ArrayCon addObject:cfile]; 运行时它总是死掉(评论这一行会停止崩溃,但显然会破坏功能!)
编辑:感谢smorgan's answer(使用NSZombieEnabled),我有一个更有用的错误信息:
*** -[CFArray release]: message sent to deallocated instance 0x155a70
【问题讨论】:
-
TableListCon.m 的链接已损坏。
-
这很奇怪,似乎 stackoverflow 对下划线进行了 url 编码(在项目名称中),似乎在编辑后工作,感谢指出
-
奇怪。将 URL 中的“tvnamergui%5Fosx”更改为“tvnamergui_osx”,它会起作用,或者使用..is.gd/xTIg
标签: objective-c cocoa memory-management