此代码的问题在于,当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]
答案 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.... */
}