2013-10-16 32 views
1

我有這個崩潰:objc_retains在我的代碼。objc_retain塊BlocksKit

我的項目是ARC。

然後我添加一個符號斷點,其符號是「objc_retain」,模塊是「libobjc.A.dylib」。

而且我發現它終於崩潰,在這個文件「BlocksKit」的:

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

如果我不使用的功能「performBlock ......」「BlocksKit」的,它的工作原理:

- (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

看起來代碼只是將塊的副本與自身相關聯(類似於創建ivar ref)。 。 。它應該沒問題。你可以在崩潰時打印堆棧跟蹤嗎? (http://stackoverflow.com/questions/220159/how-do-you-print-out-a-stack-trace-to-the-console-log-in-cocoa)併發布堆棧跟蹤。 –

+0

感謝您的回覆!我發佈了堆棧跟蹤。 – Aevit

回答

0

我不知道爲什麼發生這種情況(它看起來OK從遠處),但有很多方法可以解決它。

怎麼樣,而不是使用:

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

否則可能引發的問題與BlocksKit的作者?

0

我看過你的項目。它看起來很怪。一些觀察:

  1. 從目標中刪除QQSDKCall.m後,它不再崩潰。但是,QQSDKCall目前還沒有在應用程序的其他部分使用,所以這有點奇怪。此外,QQSDKCall是使用騰訊SDK的唯一代碼。
  2. 刪除QQSDKCall.m後,將[TencentOAuth class];行放入代碼中(即使是未調用的代碼,如-[ViewController didReceiveMemoryWarning])也會導致再次崩潰。這可能與鏈接程序不鏈接其他代碼中未引用的類有關。 ("Unknown class <MyClass> in Interface Builder file" error at runtime
  3. 爲了確認,在刪除QQSDKCall.m並且不放入該行代碼後,添加編譯器標誌-all_load -ObjC以強制鏈接器鏈接所有文件也會導致其崩潰。

結論:在連接騰訊庫後運行時崩潰。你的項目沒有這些庫的來源,所以很難猜測那裏發生了什麼。我發現將performBlock:afterDelay:的執行復制到ViewController類似乎使它不會崩潰。所以騰訊庫可能包含了自己的類別NSObject,它實現了一個名爲performBlock:afterDelay:的方法。 (加載兩個類別的順序是不確定的。)也許它們的實現返回void而不是像BlocksKit那樣的id。所以,當Xcode(它認爲你正在調用BlockKit)希望返回id並試圖保留它時,它實際上是垃圾並保留它崩潰。