而循环内存问题

时间:2011-04-07 06:43:44

标签: iphone xcode ios mpmusicplayercontroller

此代码的问题在于,当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 :(得分:0)

这是你在那里的一些效率低下的代码....这是一个替代品,不会无缘无故地分配内存,你可能想要在那里睡一觉,所以它不会吃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]

答案 1 :(得分:0)

我已经解决了这个问题。用Timer替换了while循环并进行了一些更改。 创建了一个每秒触发的计时器

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

然后在performAction中,检查当前播放时间并使计时器无效,时间差<= 1秒

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

         /* Performed my desired action here.... */
    }