为什么在AFNetworking中使用点对点类型(NSProgress * __autoreleasing *)而不仅仅是点类型(NSProgress * __autoreleasing)?

时间:2014-09-21 04:34:02

标签: ios objective-c afnetworking

在AFNetworking中我找到了这个功能:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                         fromFile:(NSURL *)fileURL
                                         progress:(NSProgress * __autoreleasing *)progress
                                completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;

此处进度类型为NSProgress * __autoreleasing *。

我不知道为什么使用点对点类型而不仅仅是点类型。 progress函数的用法如下所示:

if (progress) {
    *progress = delegate.uploadProgress;
}

在我看来,如果声明:

NSProgress *progress = nil;

传:

progress:(NSProgress * __autoreleasing *)progress

并将其用作:

*progress = delegate.uploadProgress;

与传递

相同
progress:(__autoreleasing NSProgress *)progress

并将其用作:

progress  = delegate.uploadProgress;

是否可以帮助解释为什么在这里使用点对点类型?

1 个答案:

答案 0 :(得分:1)

该参数的目的是让方法传回指向NSProgress对象的指针。为此,该方法需要分配给调用者的变量。

函数接收传递值的副本。如果参数只是__autoreleasing NSProgress*,那么函数将接收传递指针的副本。调用者和方法都有包含指向NSProgress对象的指针的变量,但它们是单独的变量。当使用progress = delegate.uploadProgress;分配给其变量的方法时,它只会更改其副本。赋值不会影响调用者的变量。

当参数为NSProgress * __autoreleasing *并且调用者通过&callersProgress时,函数会收到指向调用者变量的指针的副本。当方法使用*progress(如*progress = delegate.uploadProgress;)时,它会取消引用该指针。这产生了对调用者变量的引用。因此,该方法是分配给调用者的变量,而不仅仅是局部变量。