Повторное использование переменной NSString - это вызывает утечку памяти? - PullRequest
0 голосов
/ 10 мая 2009

Исходя из .NET-фона, я использую для многократного использования строковых переменных для хранения, так может ли приведенный ниже код вызвать утечку памяти? Код ориентирован на iphone / itouch, поэтому нет автоматического GC.

-(NSString*) stringExample
{
    NSString *result = @"example";
    result = [result stringByAppendingString:@" test"]; // where does "example" go?

    return result;
}

Что меня смущает, так это строки NSSt неизменяемые, но вы можете без проблем использовать переменную «неизменяемая».

Ответы [ 3 ]

13 голосов
/ 10 мая 2009

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

Например, это абсолютно безопасно:

NSString *result = @"example";
result = [result stringByAppendingString:@" test"];

потому что исходная строка на самом деле была строковой константой target-c. Это, однако, приведет к утечке памяти:

NSString *result = [[NSString alloc] initWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];

Это, однако, было бы безопасно, поскольку вы никогда не владели результатом:

NSString *result = [NSString stringWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];

Так что, в принципе, если вы не являетесь владельцем объекта или у вас включена сборка мусора, это безопасно. Однако, если вы владеете исходным объектом и делаете это, у вас будет утечка памяти.

2 голосов
/ 10 мая 2009

Ответ на вопрос Джейсона: если вы не позвоните retain, init, copy, mutableCopy или не воспользуетесь одним из методов initWithSomething, вы не станете владеть объект.

Итак, в вашем коде @"example" - это строковая константа, хранящаяся в скомпилированном коде, поэтому освобождать нечего. И, поскольку вы возвращаете stringWithString, вы не являетесь владельцем объекта и можете предположить, что он будет автоматически освобожден в какой-то момент в будущем.

0 голосов
/ 09 марта 2010

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

Но парень .Net никогда не использовал недопустимых утверждений, которые могут вызвать утечку памяти! Вышеприведенные утверждения, безусловно, являются законными и возвращают строку @ "example test".

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