Если я хочу сделать новый экземпляр объекта в функции, указатель которой передается по ссылке в нем - PullRequest
0 голосов
/ 28 июля 2010
- (void)createAString:(NSString **)str
{
   *str = [NSString stringWithString:@"Hi all!"];
   [*str autorelease]; // ???? is this right ?
}

Как использовать релиз или авто-релиз?Я не хочу выпускать за пределы функции, конечно:)

...
NSString *createStr;
[self createAString:&createStr];
NSLog(@"%@", createStr);

Ответы [ 2 ]

2 голосов
/ 28 июля 2010

Вы правы, что обычно вы хотите возвращать автоматически освобожденные (или подобные) объекты из параметров при использовании этой формы. Ваш оператор присваивания в функции, которая устанавливает *str в строку:

*str = [NSString stringWithString:@"foo"];

уже делает правильные вещи, потому что этот метод возвращает экземпляр NSString, который не принадлежит вызывающей стороне. Точно так же, как вы можете вернуть этот строковый объект из вашей функции без какого-либо дальнейшего управления памятью, вы можете установить его как результат, как вы сделали. Ваш второй фрагмент, показывающий сайт вызовов, в порядке.


Это говорит о том, что я беспокоюсь о некоторых вещах в вашем коде, которые вы должны быть уверены, что понимаете:

  1. Значение str внутри метода по-прежнему равно **, и отправка этого сообщения (как вы сделали для умозрительного autorelease) - нонсенс. Убедитесь, что вы полностью понимаете двунаправленные указатели, прежде чем использовать их слишком свободно. :) Если вам нужно отправить str сообщение после его создания, отправьте его на *str, который содержит NSString *.

  2. Установка outparam, подобная этой, когда функция возвращает void, не является идиоматическим Какао. Обычно вы просто возвращаете NSString * напрямую. Outparams редки в какао. (Обычно только NSError s получают эту обработку от вызовов платформы. В противном случае они обычно используют имя, такое как getString, чтобы отличить их от обычных методов доступа get, которые не используют слово "get".)

  3. Надеюсь -stringWithString был только примером. Этот метод практически никогда не используется на практике, поскольку он эквивалентен (в данном случае) простому использованию @"string literal" (хотя это может испортить ваш пример).

0 голосов
/ 28 июля 2010

Вместо использования двойного указателя, не было бы более элегантно использовать вместо NSMutableString?

- (void)createAString:(NSMutableString *)str
{
    [str setString:@"Hi all!"];
}

....

NSMutableString *createStr = [[NSMutableString alloc] init];
[self createAString: createStr];
NSLog(@"%@", createStr);
[createStr release];

Или, что еще лучше, просто используйте метод createAString, возвращающий NSString.

- (NSString *)createAString
{
    return @"Hi all!"; // this is autoreleased automatically
}

Я бы не хотел предполагать, что ваши потребности настолько просты. =)

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