gpt4 book ai didi

objective-c - 在 Objective-C 中使用引用传递

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:02 24 4
gpt4 key购买 nike

查看 JSON-Framework 源代码,它在许多解析器方法签名中大量使用了按引用传递。即

@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 来指示成功或失败;因此,它们使用输出参数来返回其他值和对象。

关于objective-c - 在 Objective-C 中使用引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2249040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com