我遇到了这个崩溃:我的代码中的objc_retains。
我的项目是ARC。
然后我添加一个符号断点,其符号为“objc_retain”,Module为“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
)
答案 0 :(得分:0)
我不确定为什么这种情况发生(从远处看起来还不错),但是有很多方法可以解决它。
如何使用:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0.3];
否则可能会引起BlocksKit作者的问题?
答案 1 :(得分:0)
我看过你的项目。它看起来比我们更奇怪。一些观察:
[TencentOAuth class];
放在代码中的任何位置(即使是未调用的代码,如-[ViewController didReceiveMemoryWarning]
)也会导致它再次崩溃。这可能与链接器如何不链接其他代码中未引用的类有关。 ("Unknown class <MyClass> in Interface Builder file" error at runtime)-all_load -ObjC
以强制链接器链接所有文件也会导致崩溃。结论:在链接腾讯图书馆后运行时崩溃。您的项目没有这些库的来源,因此很难推测那里发生了什么。我发现将performBlock:afterDelay:
的实现复制到ViewController
类似乎使它不会崩溃。因此,腾讯图书馆可能包含自己的NSObject
类别,实施名为performBlock:afterDelay:
的方法。 (加载两个类别的顺序是不确定的。)也许它们的实现返回void
而不是像{Block}一样id
。因此,当Xcode(它认为你正在调用BlockKit)期望id
返回并尝试保留它时,它实际上是垃圾并保持崩溃。