2012-07-23 49 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