Использование передачи по ссылке в Objective-C - PullRequest
3 голосов
/ 12 февраля 2010

Глядя на источник 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 является наиболее подходящим, когда.

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Это действительно просто вопрос стиля. Оно должно быть единым для всего API.

С одной стороны, у вас есть стиль, в котором код состояния вызова всегда возвращается, а результат вызова находится в списке параметров.

Преимущество? Вы всегда можете проверить результат вызова на успех. Вы можете легко иметь несколько возвращаемых значений без изменения стиля.

Недостатки? Не могу просто бросить вызовы вместо параметров. Сложнее в цепи.

С другой стороны, у вас есть стиль, в котором первичные данные возвращаются из вызова, а любые коды ошибок выполняются через параметры.

Преимущества и недостатки по существу инвертированы.

Если честно, есть третий стиль: результаты не передаются и не возвращаются. Вместо этого используются исключения.

Преимущество? Более понятный код.

Недостатки? Хорошо работает для ошибок, но не так хорошо для кодов состояния, которые могут сочетаться с действительными кодами возврата.

2 голосов
/ 12 февраля 2010

Это «выходные» параметры. Они позволяют вызываемому методу присваивать значение вашей локальной переменной «o». Другими словами, вы передаете не ссылку на объект, а ссылку на локальную переменную.

В вашем случае методы возвращают BOOL, чтобы указать успех или неудачу; поэтому они используют выходные параметры для возврата других значений и объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...