初始化 dispatch_sync 块中的对象的方法被静态分析器标记为返回 nil

Method initializing an object in a dispatch_sync Block flagged by static analyzer as returning nil

我无法弄清楚为什么 Xcode 的静态分析器会给我警告“'nil' return 来自预期 return 的方法一个非空值”。方法是:

- (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
}

分析器从您自己的代码中获取线索。您的代码正在检查 uploadTask 是否为 nil 这一事实告诉分析器(不管它可能知道您正在调用的方法的任何其他信息),它可能是 nil。即使在 attempts 超过 AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask 之后,它仍有可能保持 nil。你自己的代码告诉它。并且,如果是这样,并且假设您的方法被声明为 return 一个非 nil 指针,那么您将违反您的设计合同。