0

假设播放器是(非原子的,保留),并且使用 player = _player 合成,以下哪种场景是正确的编码实践。

方案 A

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
        self.player = mp;
        [mp release];

方案 B

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    self.player = mp;

到目前为止,我一直使用场景 A 作为一般做法,但我认为这可能会导致我的代码中出现内存泄漏。

谢谢你的帮助。

编辑1:

定时器也是如此,它们给我带来了真正的麻烦。如果我使用下面的代码,这是正确的吗?如果 timerMap 也是(nonatomic,retain),并且使用 timerMap = _timerMap;

self.timerMap = [[NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES] autorelease];

发布时是否可以仅使无效,或者应该先无效然后释放?

4

3 回答 3

4

方案A绝对是要走的路,方案B会泄露mp

资料来源:苹果文档

编辑 1:

timerMap您发布的代码是错误的,再次设置属性时会导致崩溃。你一定不要autorelease

self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(updateAnimationTimer) userInfo:nil repeats:YES];

当您不再需要计时器时,只需

self.timerMap = nil; 

这将调用release计时器上的方法并将指针设置为nil

于 2012-07-23T10:11:36.040 回答
1

场景 A 是正确的。场景B实际上会导致内存泄漏,这是因为self.player = mp; 保留引用计数器。

以下代码也是正确的:

MPMoviePlayerController *mp = [[[MPMoviePlayerController alloc] initWithContentURL:movieURL] autorelease];
self.player = mp;
于 2012-07-23T10:15:25.417 回答
1

第一个是正确的内存管理,但我只是倾向于:

self.player = [[[MPMoviePlayerController alloc] 
                 initWithContentURL:movieURL] 
                 autorelease];

这样,我将该对象的所有内存管理保留在一行上

编辑以下编辑问题

您拥有的计时器对象已经存在autorelease,您不应该autorelease再次添加它。看看这个问题以了解便利方法的解释。

于 2012-07-23T10:15:47.297 回答