查看JSON框架源代码,它在很多解析器方法签名中大量使用了引用传递。即Objective-C中使用传递引用C
@interface SBJsonParser()
- (BOOL)scanValue:(NSObject **)o;
- (BOOL)scanRestOfArray:(NSMutableArray **)o;
- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o;
@end
这最终被使用是这样的:
id o;
[self scanValue:&o];
// Do something with o
- (BOOL)scanValue:(NSObject **)o {
// Cut down for brevity
return [self scanRestOfDictionary:(NSMutableDictionary **)o];
}
- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o {
// Cut down for brevity
*o = [NSMutableDictionary dictionaryWithCapacity:7];
[*o setObject:@"value" forKey:@"key"];
return YES;
}
什么是这种方法的好处?
编辑:我问从设计的角度来看多。我明白通过引用传递的是什么,我只是想知道什么时候适合使用它。在SBJsonParser
的设计很相似,在NSScanner
使用的API:
- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue;
对我来说,这意味着这是扫描的字符串是次要的需要知道,如果事情为扫描。这是相对于由NSString
使用的API:
+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
在这种API,该文件的内容是主要的关注,并NSError引用用于传回事件的错误出错。
就在什么时候最适合哪种API的一般想法之后。
这种技术通常被称为'引用返回'而不是'引用传递',因为它通常被用来允许被调用者向调用者提供超出常规返回值的附加值。 – jlehr 2013-10-11 17:15:59