查看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