проблема памяти цикла - PullRequest
       2

проблема памяти цикла

1 голос
/ 07 апреля 2011

Проблема с этим кодом заключается в том, что при выполнении цикла while использование памяти постоянно увеличивается. Я хочу знать, почему этот код продолжает увеличивать объем памяти, когда он находится в цикле while. Какой объект здесь пожирает память. Что можно сделать, чтобы память не увеличивалась в цикле.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSNumber *totalTime = [[self nowPlayingItem] valueForProperty:MPMediaItemPropertyPlaybackDuration];
while (self.currentPlaybackTime < [totalTime floatValue]) 
{
    NSNumber *currentTime = [[NSNumber alloc] initWithFloat:self.currentPlaybackTime];
    if([[NSThread currentThread] isCancelled])
    {
        [NSThread exit];
        [newThread release];
    }
    else if([totalTime intValue] - [currentTime intValue] == 1.0)  
    {
        if(currentTime)
            [currentTime release];
        break;
    }
    [currentTime release];
}
[pool release]

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Я решил эту проблему. Заменил цикл while на Timer и сделал несколько изменений. Создан таймер, который срабатывает каждую секунду

 timer = [NSTimer timerWithTimeInterval:1
                                target:self
                              selector:@selector(performAction)
                              userInfo:nil
                               repeats:YES];

, затем в executeAction проверьте текущее время воспроизведения и обнулите таймер, если разница во времени составляет <= 1 сек </p>

int totalTime = [[[self nowPlayingItem] valueForProperty:MPMediaItemPropertyPlaybackDuration] intValue];
    if((totalTime - self.currentPlaybackTime) <= 1.0)
    {
        if(timer)
            [timer invalidate];

         /* Performed my desired action here.... */
    }
0 голосов
/ 07 апреля 2011

Это какой-то неэффективный код, который у вас там есть ... Вот замена, которая не идет на умственное выделение памяти без причины, тем более вы можете захотеть усыпить ее, чтобы она не съела CPU

// not needed any more
//NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

int totalTime = [[[self nowPlayingItem] valueForProperty:MPMediaItemPropertyPlaybackDuration] intValue];

while (self.currentPlaybackTime < totalTime) 
{
    //not needed any more
    //NSNumber *currentTime = [[NSNumber alloc] initWithFloat:self.currentPlaybackTime];
    if([[NSThread currentThread] isCancelled])
    {
        [NSThread exit];
        [newThread release];
    }
    else if((totalTime - self.currentPlaybackTime) <= 1.0)  // you may never hit 1
    {
        break;
    }
}
//[pool release]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...