2012-07-23 51 views
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]; 

而当释放罚款只是无效,或者应该是无效的,然后释放?

+0

请参阅[本答案](http:// stackoverflow。com/questions/8576593/objective-c-memory-management-of-instance-members/8576760#8576760)解释合成和属性发生了什么 – 2012-07-23 10:20:34

回答

4

情形A肯定是要走的路,方案B将泄漏mp

来源:Apple Doc

编辑1:

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

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

当你不需要定时器了,只是

self.timerMap = nil; 

这将调用定时器上release方法,将指针设置为nil

+0

非常感谢,我的应用程序必须从其他地方泄漏内存。只是恼人的是它没有被仪器拾取:( – 2012-07-23 10:18:32

+0

该项目 - >分析工具对于拾取内存泄漏很有帮助(它可能会出现方案B)。试试吧! – Olotiar 2012-07-23 10:20:20

+0

你可以帮我编辑我的文章吗? ? – 2012-07-23 10:21:52

1

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

下面的代码也是正确的:

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

感谢您的帮助:) – 2012-07-23 10:24:29

1

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

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

这样,我把所有的内存管理为物体上的一个线

EDIT 以下编辑质疑

因为你有它的计时器对象是已autorelease,你不应该再添加autorelease它。请参阅this question以获取便利方法的解释。

+0

感谢您的信息,有没有什么机会可以帮助我与我的文章的编辑部分吗? – 2012-07-23 10:23:48

+0

看看我的编辑 – 2012-07-23 10:25:24

+0

非常感谢:) – 2012-07-23 10:27:21