2

我有一个为 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。

4

4 回答 4

1

您可以使用项目的 Release Build 设置(通常与 Debug Build 设置完全不同)设置断点并调试 iOS 应用程序。只需修改您的构建设置或运行/测试方案即可。然后清理、构建和设备调试。

于 2012-04-25T19:36:51.390 回答
1

我有一个类似的问题。你的双循环准确地描述了我的。我在两个while循环之间定义了一个数组。在调试模式下它很好,但是在为发布而构建时它崩溃并出现完全相同的错误。

事实证明,在 Xcode 4.xx 中,您可以将 -O0 添加到给您带来问题的文件的编译器标志中(在您的项目设置 -> 构建阶段 -> 编译源下),它将关闭编译器优化仅针对那个文件。对我来说就像一个魅力。

德鲁

于 2012-07-19T06:12:36.103 回答
0

这是编译器错误;特别是在优化方面。测试代码未优化,发布代码针对“最快、最小”进行了优化。当我删除发布版本的优化时,问题就消失了。

触发此事件的应用程序代码是托管对象上下文访问...

- (NSArray *) fetchForGroup:(Group *)group
{
    NSArray *array = [group.polygons allObjects];
    return array;
}

这是在双循环内执行的。当内部循环中满足条件时,通过“return”退出函数。此调用中的数组被双重释放。- 丹

于 2012-06-02T19:00:48.083 回答
0

似乎问题不在于应用程序代码,而在于编译器代码。错误必须在 ARC 预编译器或编译器本身中。

于 2012-04-26T16:14:08.507 回答