Утечка памяти для переменных, созданных внутри методов - PullRequest
2 голосов
/ 09 июля 2011

Мне кажется, что следующий код создаст утечку, хотя я могу ошибаться:

-(NSString*) myString{

   NSString* foo  = @"bar";
   return foo;

}

Мой вопрос:

1) Будет ли возникать утечка памяти, поскольку foo не выпущено?

2) Если это утечка памяти, то как мне ее избежать?

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

Это не утечка. @ "bar" является статически распределенной строкой, поэтому не нужно сохранять foo. Вы можете обращаться с этими строками как с автоматически выпущенными объектами, хотя они будут сопротивляться в памяти во время выполнения приложения.

Вы можете превратить его в утечку, вернув [foo retain] или [foo copy].

Технически нет смысла сохранять статические переменные. Но если вы копируете их, вы должны выпустить их.

3 голосов
/ 09 июля 2011

Краткий ответ.Этот код не даст утечки.

Длинный ответ:

С NSString это не всегда видимая утечка из-за интерна строк, а также потому, что вы не вызываете методы alloc / new / copy.Но да, это классическая точка утечки памяти в целом.

Есть два способа справиться с этим.

  • отслеживание всех объектов, которые вы возвращаете из этого (или аналогичных) метод и освобождение их.Это чрезвычайно ошибочная возможность и очень плохая почти каждый раз.
  • возвращающий автоматически выпущенный экземпляр.На самом деле, вы сделали что-то подобное здесь неявно.Это строковое назначение похоже на:
NSString *foo = [NSString stringWithString:@"bar"];

И это похоже на:

NSString *foo = [[[NSString alloc] initWithString:@"bar"] autorelease];

Итак, вы вернете объект, который имеет счет 1, ноавтоматически выпущен.Итак, когда NSAutoreleasePool будет слит, этот объект исчезнет.

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