1

我的代码中有这个崩溃:objc_retains。

我的项目是ARC。

然后我添加一个符号断点,其符号为“objc_retain”,模块为“libobjc.A.dylib”。

我发现它终于在这个“BlocksKit”文件中崩溃了:

+ (void)associateCopyOfValue:(id)value withKey:(const char *)key {
    objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

如果我没有使用“BlocksKit”的“performBlock ...”功能,它可以工作:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //if I delete the code below, it works
    [self performBlock:^(id sender) {
        NSLog(@"hit");
    } afterDelay:0.3f];
}

我已经调试了几天,但我无法解决这个问题T_T有人可以帮助我吗?

这是我的项目: http://www.mediafire.com/download/hppnt7k491y5f1k/QQSDKDemo.zip

这是调用堆栈:

callStack :(
    0   QQSDKDemo                           0x00008b8e +[NSObject(A2BlockDelegateBlocksKitPrivate) bk_accessorsMap] + 142
    1   QQSDKDemo                           0x00008de1 +[NSObject(A2BlockDelegateBlocksKitPrivate) registerDynamicDelegateNamed:forProtocol:] + 81
    2   QQSDKDemo                           0x00009f58 +[MFMailComposeViewController(BlocksKit) load] + 136
    3   libobjc.A.dylib                     0x019657f5 call_load_methods + 437
    4   libobjc.A.dylib                     0x01967de5 load_images + 133
    5   ???                                 0x8fef0c32 0x0 + 2414808114
    6   ???                                 0x8feff252 0x0 + 2414867026
    7   ???                                 0x8feff0ba 0x0 + 2414866618
    8   ???                                 0x8fef0e05 0x0 + 2414808581
    9   ???                                 0x8fef4adb 0x0 + 2414824155
    10  ???                                 0x8fef0376 0x0 + 2414805878
    11  ???                                 0x8fef0077 0x0 + 2414805111
)
4

2 回答 2

0

I'm not sure why this is happening (it looks OK from a distance), however there's plenty of ways you could work around it.

How about, instead using:

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0.3];

Otherwise perhaps raise an issue with the authors of BlocksKit?

于 2013-10-17T02:42:59.340 回答
0

我看过你的项目。它比看起来更奇怪。一些观察:

  1. 从目标中删除 QQSDKCall.m 后,它不再崩溃。但是,QQSDKCall 目前还没有在应用程序的其余部分使用,所以这有点奇怪。此外,QQSDKCall 是唯一使用腾讯 SDK 的代码。
  2. 删除 QQSDKCall.m 后,将该行[TencentOAuth class];放入代码中的任何位置(即使是未调用的代码,如-[ViewController didReceiveMemoryWarning])都会导致它再次崩溃。这可能与链接器不会链接其他代码中未引用的类有关。(“接口生成器文件中的未知类 <MyClass>”在运行时出错
  3. 确认一下,在删除 QQSDKCall.m 并且没有放入该行代码后,添加编译器标志-all_load -ObjC以强制链接器链接所有文件也会导致它崩溃。

结论:腾讯库链接后运行时崩溃。您的项目没有这些库的来源,因此很难推测那里发生了什么。我发现将实现复制performBlock:afterDelay:ViewController类中似乎不会崩溃。所以也许腾讯库包含自己的类NSObject实现一个名为performBlock:afterDelay:. (加载两个类别的顺序是不确定的。)也许它们的实现会返回void而不是id像 BlocksKit 那样。因此,当 Xcode(它认为您正在调用 BlockKit)期望id返回并尝试保留它时,它实际上是垃圾并且保留它会崩溃。

于 2013-10-27T10:44:16.207 回答