Crashlytics báo cáo tai nạn này:Tại sao ứng dụng của tôi gặp sự cố khi gán tự __weak cục bộ trong ARC?
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 ....
Các mã trong câu hỏi:
-(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];
});
}
}
Tôi cần giúp đỡ để hiểu tại sao điều này đã bị rơi và những gì tôi có thể làm để tránh nó trong tương lai. Đây là lần đầu tiên tôi nhìn thấy một cái gì đó như vụ tai nạn này, vì vậy tôi tự hỏi nếu nó là một fluke?
Thử '__weak CloudSyncButton * weakSelf = self;'. – Adam
@Adam - [tài liệu] của Apple (http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html) nói: Bạn nên trang trí các biến đúng cách. Khi sử dụng các vòng loại trong một khai báo biến đối tượng, định dạng đúng là: 'ClassName * qualifier variableName;' '__weak' là một vòng loại –
Không biết điều đó. Tôi luôn đặt vòng loại trước. Cảm ơn bạn đã cập nhật. – Adam