初始化 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
指针,那么您将违反您的设计合同。
我无法弄清楚为什么 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
指针,那么您将违反您的设计合同。