我在ARC中为XCode 4.3.1编写了一个项目,所以我根本不会搞乱保留计数。 当我在模拟器或设备上运行项目时,它运行正常。如果我在分析器下运行它以进行分配和泄漏,它运行正常。
但是,如果我将项目归档并将其分发给Ad Hoc并加载.ipa文件,则应用程序将因控制台消息而崩溃:
<Notice>: Quilters_AppP(1812,0x3f85cd98) malloc: *** error for object 0x1109a910: pointer being freed was not allocated
<Notice>: *** set a breakpoint in malloc_error_break to debug
我在malloc_error_debug中设置了一个断点,但由于发布版本中发生错误,我从未看到调试器。
这里真的很奇怪:现在我已经添加了一些NSLog语句,但问题不会重现。
这是日志:
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x34f5432c __pthread_kill + 8
1 libsystem_c.dylib 0x36e50208 pthread_kill + 48
2 libsystem_c.dylib 0x36e49298 abort + 88
3 libsystem_c.dylib 0x36e0437a free + 374
4 libobjc.A.dylib 0x36583d72 object_dispose + 14
5 CoreFoundation 0x350b6618 -[NSObject dealloc] + 76
6 CoreFoundation 0x350b6736 -[__NSArrayI dealloc] + 162
7 libobjc.A.dylib 0x3658316e _objc_rootRelease + 30
8 libobjc.A.dylib 0x36584e50 objc_release + 32
9 libobjc.A.dylib 0x36583ea6 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 218
10 libobjc.A.dylib 0x36583dc2 _objc_autoreleasePoolPop + 6
11 CoreFoundation 0x350b0cf8 _CFAutoreleasePoolPop + 12
12 UIKit 0x3218ee34 _wrapRunLoopWithAutoreleasePoolHandler + 36
13 CoreFoundation 0x35134b14 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12
14 CoreFoundation 0x35132d50 __CFRunLoopDoObservers + 252
15 CoreFoundation 0x351330aa __CFRunLoopRun + 754
16 CoreFoundation 0x350b649e CFRunLoopRunSpecific + 294
17 CoreFoundation 0x350b6366 CFRunLoopRunInMode + 98
18 GraphicsServices 0x363b2432 GSEventRunModal + 130
19 UIKit 0x321ace76 UIApplicationMain + 1074
20 Quilters_AppP 0x0003505c main (main.m:17)
21 Quilters_AppP 0x00034af4 0x33000 + 6900
请帮助我抓住这个难以捉摸的错误。该应用程序的目标是4.3 / armv7。
答案 0 :(得分:1)
您可以使用Project的Release Build设置(通常与Debug Build设置完全不同)设置断点并调试iOS应用程序。只需修改Build设置或Run / Test Schemes即可。然后清理,构建和设备调试。
答案 1 :(得分:1)
我有类似的问题。你的双循环完全描述了我的。我有一个数组被定义嵌套在两个while循环之间。在调试模式下它很好,但是当它被构建用于释放时,它会因完全相同的错误而崩溃。
事实证明,在Xcode 4.xx中你可以将-O0添加到给你问题的文件的编译器标志中(在你的项目设置下 - &gt;构建阶段 - >编译源代码)它会关闭编译器仅针对该单个文件进行优化。对我来说就像一个魅力。
德鲁
答案 2 :(得分:0)
似乎问题不是在应用程序代码中,而是在编译器代码中。错误必须在ARC预编译器或编译器本身中。
答案 3 :(得分:0)
这是编译错误;特别是在优化中。测试代码未经过优化,发布代码针对“最快,最小”进行了优化。当我删除发布版本的优化时,问题就消失了。
触发此操作的应用程序代码是托管对象上下文访问...
- (NSArray *) fetchForGroup:(Group *)group
{
NSArray *array = [group.polygons allObjects];
return array;
}
在双循环内执行。当在内循环中满足条件时,通过“return”退出该函数。此调用的数组是双重释放的。 - 丹