Вы правы, что обычно вы хотите возвращать автоматически освобожденные (или подобные) объекты из параметров при использовании этой формы. Ваш оператор присваивания в функции, которая устанавливает *str
в строку:
*str = [NSString stringWithString:@"foo"];
уже делает правильные вещи, потому что этот метод возвращает экземпляр NSString, который не принадлежит вызывающей стороне. Точно так же, как вы можете вернуть этот строковый объект из вашей функции без какого-либо дальнейшего управления памятью, вы можете установить его как результат, как вы сделали. Ваш второй фрагмент, показывающий сайт вызовов, в порядке.
Это говорит о том, что я беспокоюсь о некоторых вещах в вашем коде, которые вы должны быть уверены, что понимаете:
Значение str
внутри метода по-прежнему равно **
, и отправка этого сообщения (как вы сделали для умозрительного autorelease
) - нонсенс. Убедитесь, что вы полностью понимаете двунаправленные указатели, прежде чем использовать их слишком свободно. :) Если вам нужно отправить str
сообщение после его создания, отправьте его на *str
, который содержит NSString *
.
Установка outparam, подобная этой, когда функция возвращает void, не является идиоматическим Какао. Обычно вы просто возвращаете NSString *
напрямую. Outparams редки в какао. (Обычно только NSError
s получают эту обработку от вызовов платформы. В противном случае они обычно используют имя, такое как getString
, чтобы отличить их от обычных методов доступа get, которые не используют слово "get".)
Надеюсь -stringWithString
был только примером. Этот метод практически никогда не используется на практике, поскольку он эквивалентен (в данном случае) простому использованию @"string literal"
(хотя это может испортить ваш пример).