2010-10-22 59 views
2

我在看別人的代碼,但它似乎要釋放對象的視頻,但再繼續使用它。目標C [對象發行]

從我的面向對象編程語言的理解

現在,一旦它的發佈,應該從內存dealloc'd ...

我看不出它如何有任何引用...但我假設這就是它的原因。似乎是一個奇怪的事情,(版本它,當你還沒有完成它,爲什麼不使用自動釋放爲例)。

self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]]; 
[video release]; 

// set output image size 
video.outputWidth = 426; 
video.outputHeight = 320; 
+0

爲什麼不釋放你的視頻對象之前得到的寬度和高度? – beefon 2010-10-22 07:16:53

+0

不是我的代碼,但現在看來,因爲保留計數爲2它會釋放時,該位置沒有什麼區別。 – 2010-10-22 07:20:20

回答

5

這相當於確保視頻對象被銷燬: self.video = [[[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]] autorelease];

(假設該視頻是由自我保持)

有避免自動釋放池在可能的情況,以及它有助於定位在你的代碼關於裁判的計數誤差小的性能提升。所以...假設財產是保留或複製,那麼自我應該持有一個參考 - 這是完美的。

希望有幫助。

+0

感謝啊,那臺故事直。 – 2010-10-22 07:24:26

+0

或者只是刪除自己,例如視頻= ... – beefon 2010-11-11 07:15:55

4
self.video = [[VideoFrameExtractor alloc] initWithVideo:[Utilities bundlePath:@"sophie.mov"]]; 

這一行實際調用-setVideo:方法,其中,視頻變量可能被保留(如果相應的屬性與保留屬性聲明)。因此保留視頻對象的數量變爲2,並且補償我們釋放它的額外保留。只有當保留計數變爲0時,對象纔會被處理,所以這樣做是安全的。

我們還需要在代碼中的某處釋放的視頻(例如,在dealloc方法)是在不需要它,以避免內存泄露