Ios 为什么在AFNetworking中使用点对点类型(NSProgress*\uuu autoreleasing*)而不仅仅是点类型(NSProgress*\uu autoreleasing)?

Ios 为什么在AFNetworking中使用点对点类型(NSProgress*\uuu autoreleasing*)而不仅仅是点类型(NSProgress*\uu autoreleasing)?,ios,objective-c,afnetworking,Ios,Objective C,Afnetworking,在AFNetworking中,我发现此功能: - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL progress:(NSProgress * __autoreleasing *)prog

在AFNetworking中,我发现此功能:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                         fromFile:(NSURL *)fileURL
                                         progress:(NSProgress * __autoreleasing *)progress
                                completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;
if (progress) {
    *progress = delegate.uploadProgress;
}
这里的进度类型是NSProgress*\uuu autoreleasing*

我不知道为什么这里使用点对点类型而不仅仅是点类型。此函数中进度参数的用法如下:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                         fromFile:(NSURL *)fileURL
                                         progress:(NSProgress * __autoreleasing *)progress
                                completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler;
if (progress) {
    *progress = delegate.uploadProgress;
}
在我看来,如果声明:

NSProgress *progress = nil;
通过:

progress:(NSProgress * __autoreleasing *)progress
并将其用作:

*progress = delegate.uploadProgress;
progress  = delegate.uploadProgress;
就跟传球一样

progress:(__autoreleasing NSProgress *)progress
并将其用作:

*progress = delegate.uploadProgress;
progress  = delegate.uploadProgress;

有人能解释为什么这里使用点对点类型吗?

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

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


当参数为
NSProgress*\uu autoreleasing*
且调用者传递
&callersProgress
时,函数接收指向调用者变量的指针副本。当该方法使用
*progress
(如
*progress=delegate.uploadProgress;
)时,它将取消引用该指针。这将生成对调用方变量的引用。因此,该方法将赋值给调用方的变量,而不仅仅是一个局部变量。

在NSProgress中使用pass-by-reference确实很奇怪,因为NSProgress具有“当前”进度对象的概念。我建议查看此方法的提交和发布历史。