Глядя на источник 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
, похож на API, используемый в NSScanner
:
- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue;
Для меня это означает, что отсканированная строка является вторичной по отношению к необходимости знать, сканировалось ли что-то . Это в отличие от API, используемого NSString
:
+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
В этом API содержимое файла является основной задачей, а ссылка NSError используется для возврата ошибки в случае, если что-то идет не так.
Просто после некоторых общих размышлений о том, какой API является наиболее подходящим, когда.