查看 JSON-Framework 源代码,它在许多解析器方法签名中大量使用了按引用传递。 IE。
@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;
}
这种方法有什么好处?
EDIT:我从设计的角度要求更多。我明白什么是引用传递,我只是想知道什么时候适合使用它。该设计用于SBJsonParser
类似于中使用的APINSScanner
:
- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue;
对我来说,这意味着扫描的字符串对于需要知道是否有东西来说是次要的was已扫描。这与使用的 API 形成对比NSString
:
+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
在该 API 中,文件的内容是主要关注点,并且 NSError 引用用于在出现问题时传回错误。
在对哪种 API 在何时最合适进行一些一般性思考之后。
这些是“输出”参数。它们允许被调用的方法为局部变量“o”赋值。换句话说,您传递的不是对象的引用,而是局部变量的引用。
在您的情况下,这些方法返回一个 BOOL 来指示成功或失败;因此,它们使用输出参数来返回其他值和对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)