【问题标题】:What about this mailto: openURL might be causing a this malloc crash?这个 mailto: openURL 可能导致这个 malloc 崩溃呢?
【发布时间】:2010-08-22 16:17:52
【问题描述】:

我正在使用 openURL 发送带有一些链接的电子邮件。函数如下所示:

//
+ (void) sendEmail:(NSString *) subject withBody:(NSString *)body {
 NSString *mailString = [NSString stringWithFormat:@"mailto:?@&subject=%@&body=%@",
       [subject stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],
       [body  stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailString]];
 [mailString autorelease];
 }

调用这个函数的代码如下:

[AppNameAppDelegate sendEmail:subjectLine withBody:bodyText];

无论subjectLine和bodyText是什么,我都会收到这样的错误:

Program received signal:  “EXC_BAD_ACCESS”.

电子邮件实际上会弹出,所以我知道它是通过该 openURL 发送的。但是到那时我猜程序已经崩溃了,所以当你退出电子邮件窗格时它不会恢复。

关于为什么会发生这种情况的任何想法?

问题看起来像this,但该答案不适用。它看起来更像this forum post,但不幸的是,这个问题似乎从未解决过。

更新:删除自动释放的邮件字符串时(根据 StackOverflow ticket mentioned above 中的说明),它并没有改善这种情况。

//
+ (void) sendEmail:(NSString *) subject withBody:(NSString *)body {
 NSString *mailString = [NSString stringWithFormat:@"mailto:?@&subject=%@&body=%@",
       [subject stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],
       [body  stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailString]];
 }

设置 malloc_error_break 断点似乎没有任何作用。输出仍然如下所示:

AppName(1424,0x3e9097c8) malloc: *** error for object 0x16fdf0: double free
*** set a breakpoint in malloc_error_break to debug

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:
    NSString *mailString = [NSString stringWithFormat:...
    

    已经返回自动释放的字符串 - 你不能向它发送任何自动释放消息

    【讨论】:

    • 感谢您的回答。不幸的是,我试过这个,它似乎并没有解决我的问题。请查看更新的问题以获取输出。
    • 你的目标是什么系统?我制作了一个示例 - 没有额外自动释放的代码似乎在 iPhoneOS 3.1 上运行良好......可能会尝试清理和重建您的项目?或者你真正的问题可能不在这个函数上,而是在其他地方。
    • 我的目标是 4.0。不幸的是,我猜这个问题比我预期的要深入得多。
    • 尝试检查您的代码 - 可能存在更多冗余(自动)版本...尤其是在应用程序进入后台时调用的函数中
    【解决方案2】:

    使用 NSZombieEnabled 进行调试,如我在 this answer 中所述。

    【讨论】:

    • 感谢您的建议。将在这方面工作。但是删除此代码会消除错误,这向我暗示我可以打赌原因可能在这几行代码中。将使用此技术进行验证。
    • 找到了我的僵尸。关于我如何弄清楚内存分配代表什么的任何提示? 2010-08-22 09:34:58.165 AppName[1448:307] *** -[CFString release]: 消息发送到释放的实例 0x19a0f0
    • @editor:这意味着你在某处过度释放了一个字符串。检查以确保您没有在其他任何地方犯同样的错误。
    • @editor:是否删除了多余的autorelease 行?
    • 删除了多余的自动释放。在调试器中,该内存分配被归档在变量 $r10 下,没有更多信息。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多