Утечка памяти при использовании (void) alloc - PullRequest
1 голос
/ 23 марта 2010

Я видел похожую строку кода, плавающую в коде Apple:

(void)[[URLRequest alloc] initializeRequestWithValues:postBody url:verifySession httpHeader:nil delegate:self];

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

РЕДАКТИРОВАТЬ: проблема была с SDK, а не код выше. См. Ответ ниже для получения более подробной информации

Ответы [ 3 ]

3 голосов
/ 17 сентября 2010

Думаю, я мог бы обновить это, так как после дальнейшего тестирования и выпуска iOS4 он изменился.

Приведенный выше код не течет, и объем памяти приложения возвращается к нормальной работе даже после 200 итерацийкод.Утечка произошла в iOS3, но была очень маленькой, в iOS4 она полностью исчезла как в симуляторе, так и на устройстве.

Некоторые могут задаться вопросом, почему вы захотите реализовать этот код, но он работает и имеет смысл при работе с большим количествомразличных NSURLConnections во всем вашем коде, запущенных одновременно.

2 голосов
/ 23 марта 2010

Да. Это утечка, которую легко исправить, добавив авто-релиз:

[[[URLRequest alloc] initializeRequestWithValues:postBody url:verifySession httpHeader:nil delegate:self] autorelease];

Возможно, лучшим решением было бы создание функции класса, которая делает это:

@interface URLRequest
{
   // ...
}
// ...
+ (void) requestWithValues:/* ... */ 
// ...
@end

Тогда вы можете просто использовать [URLRequest requestWithValues: / * ... * /] без вызова alloc.

2 голосов
/ 23 марта 2010

Не совсем уверен, что этот код должен выполнить. Кажется, он нарушает все соглашения о методах инициализации. Какой смысл возвращать пустой указатель из метода инициализации? Весь смысл метода инициализации - вернуть объект. Где в примерах кода Apple вы видели это?

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

Edit:

Это в основном делает NSURLConnection. Потому что мы представляем много формы с множеством разных значений мы помещаем это во внешний класс. Все методы делегата, такие как didFailWithError: находятся в NSURLRequest и connectionDidFinishLoading просто передает данные своему делегату. Так что не нужно ничего возвращать как это делается через делегата Метод.

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

Если вам не нужно сохранять созданный объект, то перенесите его размещение и очистите полностью внутри метода. Измените префикс имени метода с «initialize» на что-то вроде «setup», «configure», «acqu» и т. Д., Чтобы имя не подразумевало, что оно создает и возвращает объект.

Если вам нужен экземпляр одного класса определенного класса, используйте метод класса, как предложил Майкл Аарон Сафян (снова без инициализации в имени.) Метод класса должен внутренне инициализировать экземпляр, выполнить необходимые операции, вернуть данные куда угодно, затем освободите экземпляр.

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

...