Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中使用参照传递_Objective C - Fatal编程技术网

在Objective-C中使用参照传递

在Objective-C中使用参照传递,objective-c,Objective C,查看JSON框架源代码,它在许多解析器方法签名中大量使用了引用传递。i、 e @interface SBJsonParser () - (BOOL)scanValue:(NSObject **)o; - (BOOL)scanRestOfArray:(NSMutableArray **)o; - (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o; @end 这最终会被这样使用: id o; [self scanValue:&am

查看JSON框架源代码,它在许多解析器方法签名中大量使用了引用传递。i、 e

@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最合适进行了一些一般性思考之后,这些是“输出”参数。它们允许被调用的方法为局部变量“o”赋值。换句话说,传递的不是对对象的引用,而是对局部变量的引用


在您的情况下,这些方法返回一个BOOL来表示成功或失败;因此,它们使用输出参数返回其他值和对象。

这实际上只是一个风格问题。它应该在整个API中保持一致

一方面,您有一种风格,调用的状态代码总是返回,并且调用的输出在参数列表中

福利?您可以随时检查通话结果是否成功。您可以轻松获得多个返回值,而无需更改样式

缺点?不能只是插入调用来代替参数。更难连锁

另一方面,您有一种样式,其中主要数据从调用返回,任何错误代码都通过out参数完成

好处和缺点基本上是颠倒的

公平地说,还有第三种方式:不传递或返回结果。相反,使用了异常

福利?看起来更干净的代码


缺点?适用于错误,但不适用于可能与有效返回代码一起使用的状态代码。

请参阅问题底部的说明。这种技术通常被称为“通过引用返回”,而不是“通过引用传递”,因为它通常用作允许被调用方向调用方提供常规返回值之外的附加值。