Как правильно вернуть NSMutableString из метода - PullRequest
1 голос
/ 02 декабря 2009

Я ищу хороший способ вернуть строку, созданную NSMutableString, чтобы избежать утечки:

например:

+(NSString *)myMethod{



 NSMutableString *numberToReturn = [[NSMutableString alloc] init];
 [numberToReturn appendString:@"lorem ipsum"];


 return numberToReturn;
}

Измеритель утечки сказал, что у меня была утечка с этой переменной.

Я пробовал авто-релиз, но он вылетает Я пытался вернуть копию или скопировать изменяемую строку в строку nsstring, но утечка все еще присутствует.

Есть идеи или уловки? Я должен вызывать этот метод каждый раз, когда пользователь вводит значение в текстовое поле, поэтому происходит сбой приложения из-за плохого управления памятью ...

спасибо

Ответы [ 2 ]

12 голосов
/ 03 декабря 2009

Вы должны использовать -autorelease. Ваш метод должен быть записан как:

+ (NSString*)myMethod {
    NSMutableString *stringToReturn = [[NSMutableString alloc] init];
    [stringToReturn appendString:@"lorem ipsum"];

   return [stringToReturn autorelease];
}

Если происходит сбой, неисправность находится в другом месте.

Конечно, вы можете использовать фабричные методы, которые возвращают уже автоматически выпущенный экземпляр, переписав ваш метод как

+ (NSString*)myMethod {
  NSMutableString *result = [NSMutableString string];
  [result appendString:@"lorem ipsum"];

  return result;
}

или еще лучше для вашего примера,

+ (NSString*)myMethod {
    NSMutableString *result = [NSMutableString stringWithString:@"lorem ipsum"];
    //...do something with result;
    return result;
}

Очевидно, что если единственная цель вашего метода - просто вернуть новую строку со строкой, вы можете избежать всего метода целиком и использовать [NSMutableString stringWithString:@"lorem ipsum"], если вам действительно нужна изменяемая строка.

4 голосов
/ 03 декабря 2009

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

...