Crashlytics segnalato questo incidente:Perché la mia app si è arrestata in modo anomalo durante l'assegnazione di self a __weak locale in 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 ....
Il codice in questione:
-(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];
});
}
}
Ho bisogno di aiuto capire perché questo è caduto e che cosa posso fare per evitare in futuro. Questa è la prima volta che vedo qualcosa di simile a questo incidente, quindi mi chiedo se è un colpo di fortuna?
Provare '__weak CloudSyncButton * weakSelf = self;'. – Adam
@Adam - Apple [documentazione] (http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html) dice: È necessario decorare le variabili correttamente. Quando si utilizzano i qualificatori in una dichiarazione di variabile di oggetto, il formato corretto è: 'Qualificatore di qualificatore ClassName *, mentre' '__weak' è un qualificatore –
Non lo sapeva. Metto sempre il qualificatore per primo. Grazie per l'aggiornamento. – Adam