Crash sur NSError

samirsamir Membre
mai 2015 modifié dans API UIKit #1

Hello,


 


J'ai un crash que je n'arrive pas à  comprendre, enfin je sais que ça un  rapport avec ARC.


 


Voici un bout de mon code :



- (BOOL)validateWithError:(NSError *__autoreleasing *)error {

__block BOOL valid = YES;
[self.objs enumerateObjectsUsingBlock:^(SGInsured *insured, NSUInteger idx, BOOL *stop) {
NSInteger age = [self age:insured.dateNaissance];
if (age < kMinimumYearAge || age > kMaximumYearAge) {
if (error) {
NSString *desc = NSLocalizedString(@La date de naissance est incorrecte, nil);
NSDictionary *userInfo = @{NSLocalizedDescriptionKey:desc};
*error = [[NSError alloc] initWithDomain:SGInsuredErrorDomain code:SGInsuredErrorCodeDateOfBirth userInfo:userInfo];
}
valid = NO;
*stop = YES;
}
}];
return valid;
}

Quand j'apple cette méthode j'ai un crash : " [NSError retain] Message sent do deallocated instance"


 


J'apelle la méthode comme suit ;



NSError *error;

BOOL valid = [self.validator validateWithError:&error];
....

Réponses

  • DrakenDraken Membre
    mai 2015 modifié #2

    Quand j'apple cette méthode j'ai un crash : " [NSError retain] Message sent do deallocated instance"



    T'es vraiment un fanboy de pur race, toi ..


  • samirsamir Membre


    T'es vraiment un fanboy de pur race, toi ..




    Non je suis plutôt mauvais en orthographe :).


     


    Bon j'ai corrigé mon crash de cette façon :



    - (BOOL)validateWithError:(NSError *__autoreleasing *)error {

    __block __strong NSError *strongError = nil;
       ....
       *error = strongError;
    }

    PS : J'aurais pu ne pas mettre le __strong puisque c'est le qualificatif par défaut mais je trouve ça plus explicite. 


     


     


    Doc :


     



    • __autoreleasing is used to denote arguments that are passed by reference (id *) and are autoreleased on return.

    https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html


     


     


    Un bug ARC ?  

  • AliGatorAliGator Membre, Modérateur
    Effectivement ça y ressemble.

    En même temps c'est pas étonnant car ce qui est capturé par le block de enumerateObjectsUsingBlock c'est "error" (donc NSError**) et pas "*error" du coup je peux comprendre qu'il s'emmêle les pinceaux dans ce genre de cas. Du coup bien vu pour la solution ;)
Connectez-vous ou Inscrivez-vous pour répondre.