首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objc_retain for BlocksKit

objc_retain for BlocksKit
EN

Stack Overflow用户
提问于 2013-10-16 04:26:59
回答 2查看 1.1K关注 0票数 1

我的代码中有这个crash:objc_retains。

我的项目是ARC。

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

最后,我发现它在“BlocksKit”文件中崩溃了:

代码语言:javascript
复制
+ (void)associateCopyOfValue:(id)value withKey:(const char *)key {
    objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

如果我不使用函数“performBlock.”对于"BlocksKit",它的工作原理是:

代码语言:javascript
复制
- (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];
}

我已经调试了好几天了,但是我无法解决这个problemT_T,有人能帮我吗?

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

这是调用堆栈:

代码语言:javascript
复制
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
)
EN

回答 2

Stack Overflow用户

发布于 2013-10-17 02:42:59

我不知道为什么会发生这种情况(从远处看还可以),但是有很多方法可以解决这个问题。

不如使用:

代码语言:javascript
复制
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0.3];

否则,也许会向BlocksKit的作者提出一个问题?

票数 0
EN

Stack Overflow用户

发布于 2013-10-27 10:44:16

我看过你的项目了。这比看上去更奇怪。一些意见:

  1. 从目标中删除QQSDKCall.m后,它不再崩溃。然而,QQSDKCall目前没有在应用程序的其余部分使用,所以这有点奇怪。此外,QQSDKCall是唯一使用腾讯SDK的代码。
  2. 删除QQSDKCall.m之后,将行[TencentOAuth class];放在代码中的任何位置(即使是没有调用的代码,比如-[ViewController didReceiveMemoryWarning]),也会导致它再次崩溃。这可能与链接器如何不链接其他代码中未引用的类有关。( in Interface Builder file" error at runtime)
  3. 要确认的是,在删除QQSDKCall.m并没有放入这一行代码之后,添加编译器标志-all_load -ObjC以强制链接所有文件也会导致其崩溃。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19395244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档