Почему один из этих методов вызывает утечку, а другой нет - PullRequest
0 голосов
/ 06 июня 2011

В моем приложении я получаю утечку памяти в

первый

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {  
    result = [[NSString alloc] initWithBytes:[webData mutableBytes]
                                      length:[webData length]
                                    encoding:NSUTF8StringEncoding];  
    [webData release];  
}

секунда

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {  
    NSString * result = [[NSString alloc] initWithBytes:[webData mutableBytes]
                                                 length:[webData length]
                                               encoding:NSUTF8StringEncoding];
    [webData release];
}

в моем первом процессе я не получил утечку памяти (объявил строковый объект глобально, и я не освободил его)

Во втором процессе я получаю утечку памяти в строковом объекте.

  1. Значение, сохраненное в «результате» во время его инициализации, никогда не читается

  2. Метод возвращает объект Objective C с счетом сохранения +1 (ссылка на владельца)

  3. Объект, размещенный в строке 124 и сохраненный в 'result', больше не ссылается после этой точки и имеет счет сохранения +1 (утечка объекта)

в чем разница?

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

В первом случае анализатор ожидает, что вы освободите свою инициализированную строку result в, скажем, методе - (void)dealloc класса. Если вы этого не сделаете - вы также получите утечку (вы увидите утечку, если запустите свое приложение через приложение Instruments с добавленным инструментом Leaks.

Во втором случае вы создаете локальную переменную в области действия метода, где она также должна быть освобождена, поскольку у вас не будет ссылки на нее ни в каком другом методе (т. Е. Если вы попытаетесь получить доступ к переменной result в другом методе) вы получите неизвестный идентификатор ошибки).

1 голос
/ 06 июня 2011

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

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

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