NSInvocationOperation Проблемы с памятью на iPhone - PullRequest
0 голосов
/ 18 декабря 2009

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

Метод будет вызываться каждые 1/4 секунды, и я сузил источник проблемы до следующих тестовых строк:

-(void)methodCalledByTimer {

        NSInvocationOperation *o = [NSInvocationOperation alloc];
        [o release];

}

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

Кто-нибудь может объяснить, что я здесь делаю не так? Нужно ли делать что-то еще, чтобы убедиться, что объект NSInvocationOperation будет правильно освобожден?

Большое спасибо в avance за помощь.

С уважением, Майкл.

Ответы [ 2 ]

0 голосов
/ 05 января 2010

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

NSInvocationOperation *o = [[NSInvocationOperation alloc] initWithTarget:yourTarget selector:@selector(yourSelector) object:yourObjectOrNil];

Что касается ответа mjdth, я считаю, что вы не должны пытаться повторно использовать операцию вызова. Из документации NSOperation (суперкласс NSInvoationOperation):

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

Кроме того, объект Objective-C никогда не должен инициализироваться дважды.

0 голосов
/ 18 декабря 2009

Возможное решение может заключаться в том, чтобы просто хранить ваш NSInvocationOperation в другом месте, а не создавать и выпускать его каждый раз, когда вызывается methodCalledByTimer.

У меня были проблемы с NSCalendar, где я создавал и выпускал тысячу раз, чтобы использовать его для какой-либо работы с датами, но затем я просто создал один календарь, прикрепленный к appDelegate, и каждый раз обращался к нему. Исправлено множество утечек памяти, и это, вероятно, лучше, чем каждый раз создавать новый объект.

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