我好心满意
***__NSAutoreleaseNoPool():类NSEvent的对象0x1961180自动释放,没有池到位 - 只是泄漏
在运行期间发出警告,并且不知道原因是什么.粗略谷歌表示这是我可以用Xcode打破的符号,但是通过运行>管理断点>添加符号断点,或者只是通过断点管理窗口将其添加为符号断点,会产生一个断点,旁边有一个 - 而不是检查,我认为它是一个无法找到的符号.
我尝试添加带有两个下划线,一个下划线的符号"__NSAutoreleaseNoPool",现在我感觉很愚蠢.错误继续被记录,没有断点被击中.任何打破Obj-C符号或调试它的指针都将受到赞赏.
[编辑:大概10(10多个,所以总共几十个,包括至少两个Xcode重启)运行我得到"待断点9 - "_ _ NSAutoreleaseNoPool"已解决"打印到我的控制台,断点开始工作.有没有办法强制挂起的断点实际解决?]
Sco*_*rks 25
要真正回答您的问题,请查看NSDebug.h
.在那里你会发现一个评论,这是其中的一部分:
NAME OF ENV. VARIABLE DEFAULT SET TO...
NSDebugEnabled NO "YES"
NSZombieEnabled NO "YES"
NSDeallocateZombies NO "YES"
NSHangOnUncaughtException NO "YES"
Run Code Online (Sandbox Code Playgroud)
这些评论更进一步:
// Functions used as interesting breakpoints in a debugger
// void __NSAutoreleaseNoPool(void *object);
// Called to log the "Object X of class Y autoreleased with no
// pool in place - just leaking" message. If an environment
// variable named "NSAutoreleaseHaltOnNoPool" is set with string
// value "YES", the function will automatically break in the
// debugger (or terminate the process).
// void __NSAutoreleaseFreedObject(void *freedObject);
// Called when a previously freed object would be released
// by an autorelease pool. If an environment variable named
// "NSAutoreleaseHaltOnFreedObject" is set with string value
// "YES", the function will automatically break in the debugger
// (or terminate the process).
Run Code Online (Sandbox Code Playgroud)
所以你真的不需要设置这些断点; 只需设置适当的环境变量.你可以做后者无论是从您如.bashrc
或在Xcode 4您可以编辑你的"方案"中的"运行"部分,并将他们那里-这就是我做的,它工作得很好.
小智 5
我在__NSAutoreleaseNoPool()上设置断点时遇到了同样的问题.我终于成功设置了断点使用gdb命令.调试器启动后,在调试器控制台中按ctrl + C. 使用"br __NSAutoreleaseNoPool"设置断点并重新启动调试器.
这里的问题很简单:您在没有池的情况下进行释放。这通常发生在针对 Foundation 编写的命令行工具中。只需将以下代码添加到您的main()
:(省略无关部分)
int main (\xe2\x80\xa6) {\n NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\n /// Your code goes here.\n\n [pool drain]; // This one might not strictly speaking be neccessary.\n [pool release];\n\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n编辑:如果您没有创建命令行工具,那么您很可能正在做一些顽皮的事情;但尽管如此:如果您之前调用了代码NSApplicationMain()
,则需要将其包装在相同的基本代码中,在调用之前耗尽并释放池NSApplicationMain
。
归档时间: |
|
查看次数: |
7134 次 |
最近记录: |