0

Je n'arrive pas à comprendre pourquoi l'analyseur statique de Xcode me donne l'avertissement "'nil' renvoyé d'une méthode qui devrait renvoyer une valeur non nulle valeur". La méthode est la suivante:Méthode d'initialisation d'un objet dans un dispatch_sync Bloc signalé par un analyseur statique comme renvoyant

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request 
            fromFile:(NSURL *)fileURL 
            progress:(NSProgress * __autoreleasing *)progress 
            completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { 
__block NSURLSessionUploadTask *uploadTask = nil; 
dispatch_sync(url_session_manager_creation_queue(), ^{ 
    uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; 
}); 

if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) { 
    for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) { 
     uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; 
    } 
} 

[self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; 

return uploadTask; // nil returned from a method that is expected to return a non-null value 
} 
+0

Etats de l'analyseur: nul retourné d'une méthode qui devrait renvoyer une valeur non nulle –

+0

Comment cette méthode est-elle déclarée dans le fichier '.h'? Et cela remplace-t-il une méthode de super-classe? –

+0

Est-ce que 'self.session' est nul? – PHD

Répondre

0

L'analyseur prend des repères à partir de votre propre code. Le fait que votre code vérifie si uploadTask est nil indique à l'analyseur (indépendamment de tout ce qu'il peut savoir sur les méthodes que vous appelez) qu'il peut s'agir de nil. Il y a une chance qu'il continue à être nil même après que attempts dépasse AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask. Votre propre code le dit. Et, si oui, et en supposant que votre méthode est déclarée pour renvoyer un pointeur non nil, alors vous violez votre contrat de conception.