为什么这个方法通过引用传递'stop'而不是return?

时间:2013-08-09 23:56:25

标签: objective-c return-value pass-by-reference objective-c-blocks

有没有人对

的阻止参数的原因有所了解
- (void)enumerateMatchesInString:(NSString *)string
                         options:(NSMatchingOptions)options
                           range:(NSRange)range
                      usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block

通过引用传递stop而不是返回它?

对我来说似乎“显而易见”,你可以使用返回值,这可能意味着我错过了一些东西,我想知道我错过了什么。 (我唯一能想到的是你能够通过引用变量提供一个名称来使它们的含义更清晰。)

1 个答案:

答案 0 :(得分:2)

我的猜测是因为不一定需要stop功能,并且使块返回void可以使语法更轻松,因为您可以从代码的末尾开始返回:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSLog(@"result: %@", result);
}];

而不是:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags) {
    NSLog(@"result: %@", result);
    return YES;
}];

另外,正如你所指出的那样,有一个清晰的问题。如果不检查文档,就很难分辨返回值对枚举的意义。 (另外,谈到块返回值:我的-[NSArray collectResultsUsingBlock:]方法在哪里?)

一个额外的次要因素可能是BOOL类型与块类型推断不能很好地兼容,所以这个:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags) {
    return YES;
}];

会抛出一个类型错误,要求您执行以下任一操作:

return (BOOL)YES;

或:

usingBlock:^BOOL (NSTextCheckingResult…

为了让一切顺利。

所有这些只是排名猜测。文件似乎对此事保持沉默; Coding Guidelines for Cocoa似乎没有更新,甚至包括Apple似乎已在内部采用的标准化工作,例如始终在原型声明中为块参数提供名称。