【问题标题】:iOS sigbart abort crashiOS sigabrt 中止崩溃
【发布时间】:2018-02-01 05:32:12
【问题描述】:

我在以下方法中遇到随机崩溃:

- (void) addLineToVCard:(NSMutableString **)vCard forKey:(NSString *)key setValue:(NSString *)value
{
        [*vCard appendString:[NSString stringWithFormat:@"%@:%@\r\n", key, value]];

}

我称之为:

NSMutableString* vCard = [NSMutableString string];
[self addLineToVCard:&vCard forKey:@"BEGIN"   setValue:@"VCARD"];
[self addLineToVCard:&vCard forKey:@"VERSION" setValue:@"3.0"];

我做错了什么?我可以通过传递引用而不是指针对象来避免这种情况。但是我想知道这里崩溃的原因。

崩溃日志:

Crashed: com.apple.main-thread
0  libsystem_kernel.dylib         0x251e6c5c __pthread_kill + 8
1  libsystem_pthread.dylib        0x25290733 pthread_kill + 62
2  libsystem_c.dylib              0x2517b0ad abort + 108
3  libsystem_malloc.dylib         0x252180ad free_list_checksum_botch + 362
4  libsystem_malloc.dylib         0x252181db free_tiny_botch + 66
5  CoreFoundation                 0x255332d3 __CFStringChangeSizeMultiple + 1838
6  CoreFoundation                 0x2553178b __CFStringCheckAndReplace + 554
7  CoreFoundation                 0x25491557 -[__NSCFString appendString:] + 26
8  iPhoneHandheldACT              0x1ae7cf -[ContactDetailViewController addLineToVCard:forKey:setValue:] (ContactDetailViewController.m:3009)
9  iPhoneHandheldACT              0x1ae515 -[ContactDetailViewController assembleVCard:] (ContactDetailViewController.m:2987)
10 iPhoneHandheldACT              0x1adcbd -[ContactDetailViewController shareVCard:] (ContactDetailViewController.m:2927)
11 iPhoneHandheldACT              0x1ad351 __47-[ContactDetailViewController btnSharePressed:]_block_invoke (ContactDetailViewController.m:2813)
12 UIKit                          0x29f2cbd9 -[UIAlertController _fireOffActionOnTargetIfValidForAction:] + 68
13 UIKit                          0x29f2d283 __85-[UIAlertController _dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:]_block_invoke + 30
14 UIKit                          0x29e237e3 -[UIPresentationController transitionDidFinish:] + 1230
15 UIKit                          0x29e26a85 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke_2 + 192
16 UIKit                          0x29c04157 -[_UIViewControllerTransitionContext completeTransition:] + 90
17 UIKit                          0x29b11ba5 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 540
18 UIKit                          0x29b11685 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 204
19 UIKit                          0x29b1157f -[UIViewAnimationState animationDidStop:finished:] + 78
20 QuartzCore                     0x27b71689 CA::Layer::run_animation_callbacks(void*) + 252
21 libdispatch.dylib              0x250c980f _dispatch_client_callout + 22
22 libdispatch.dylib              0x250d7ba9 _dispatch_main_queue_callback_4CF$VARIANT$mp + 1524
23 CoreFoundation                 0x2551db6d __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
24 CoreFoundation                 0x2551c067 __CFRunLoopRun + 1574
25 CoreFoundation                 0x2546b229 CFRunLoopRunSpecific + 520
26 CoreFoundation                 0x2546b015 CFRunLoopRunInMode + 108
27 GraphicsServices               0x26a5bac9 GSEventRunModal + 160
28 UIKit                          0x29b3f189 UIApplicationMain + 144
29 iPhoneHandheldACT              0xcbe21 main (main.m:16)
30 libdispatch.dylib              0x25113873 (Missing)

【问题讨论】:

  • 不相关但为什么要使用NSString stringWithFormatNSMutableString?只需使用appendFormat
  • 我没有从你的代码中得到任何崩溃。刚刚复制并粘贴了您的代码,它工作正常。
  • @Gagan_iOS 你是对的。这是随机的,我无法复制。这是我从 crashlytics 获得的日志。所以我想知道什么时候会失败。
  • 您在 Crashlytics 日志中没有得到任何行号吗?
  • @Gagan_iOS,它是:3009,也就是[*vCard appendString:[NSString stringWithFormat:@"%@:%@\r\n", key, value]];

标签: ios objective-c nsmutablestring


【解决方案1】:

指针的指针不是必须的,就像这样:

- (void)addLineToVCard:(NSMutableString *)vCard forKey:(NSString *)key setValue:(NSString *)value
{
    [vCard appendFormat:@"%@:%@\r\n", key, value];
}

然后使用它:

NSMutableString* vCard = [NSMutableString string];
[self addLineToVCard:vCard forKey:@"BEGIN"   setValue:@"VCARD"];
[self addLineToVCard:vCard forKey:@"VERSION" setValue:@"3.0"];

结果:

(lldb) po vCard
BEGIN:VCARD
VERSION:3.0

【讨论】:

  • 去掉stringWithFormat。就这样做:[vCard appendFormat:@"%@:%@\r\n", key, value];
  • @rmaddy,是的,同意你的看法。我更新了你说的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多