为什么在将自己分配给ARC下的__weak本地时我的应用程序崩溃了?

时间:2013-06-03 14:24:45

标签: ios automatic-ref-counting weak-references

Crashlytics报告了此次崩溃:

0    libobjc.A.dylib     _objc_trap() + 18446744073709552000
1    libobjc.A.dylib     _objc_fatal + 71
2    libobjc.A.dylib     append_referrer_no_lock(weak_referrer_array_t*, objc_object**)
3    libobjc.A.dylib     objc_storeWeak + 120
4    MyApp               CloudSyncButton.m line 58 -[CloudSyncButton observeValueForKeyPath:ofObject:change:context:]
5    ....

有问题的代码:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    CloudSyncButton* __weak weakSelf = self;  //<---crashed here
    if([keyPath isEqualToString:kCloudSyncingKVO]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            CloudSyncButton* localSelf = weakSelf;
            [localSelf refreshCloudSyncIcon];
        });
    }
}

我需要帮助理解为什么这会崩溃以及我将来能做些什么来避免它。这是我第一次看到这样的事情,所以我想知道这是不是侥幸?

1 个答案:

答案 0 :(得分:7)

确保在所有情况下,您的CloudSyncButton都已将其自身从其dealloc方法中的其他对象中删除。在您的按钮被取消分配后,似乎会收到此消息。