Crashlytics сообщил об этом аварии:Почему мое приложение потерпело крах при назначении себя __weak local под 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 ....
Код в вопросе:
-(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];
});
}
}
мне нужна помощь, чтобы понять, почему это разбился, и что я могу сделать, чтобы избежать этого в будущем. Это первый раз, когда я видел что-то вроде этого сбоя, поэтому мне интересно, если это случайность?
Попробуйте '__weak CloudSyncButton * weakSelf = self;'. – Adam
@Adam - [документация Apple] (http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html) говорит: вы должны правильно декорировать переменные. При использовании квалификаторов в объявлении переменной объекта правильный формат: 'ClassName * qualifier variableName;' '__weak' является квалификатором –
Не знал этого. Я всегда ставил квалификатор в первую очередь. Благодарим за обновление. – Adam