2012-03-19 54 views
1

我使用下面的代碼旋轉圖像圖像旋轉後應該保持增加數量嗎?

http://www.platinumball.net/blog/2010/01/31/iphone-uiimage-rotation-and-scaling/

這是爲數不多的圖像變換,我的圖像上傳到服務器之前做的一個,我也有一些其他的轉換:規範化,作物,調整大小。

每個轉換都會返回一個(UIImage*),我使用一個類別添加這些函數。我用這樣的:

UIImage *img = //image from camera; 
img = [[[img normalize] rotate] scale] resize]; 
[upload img]; 

從相機中選擇3〜4張照片,每一次執行相同的代碼後,我得到了XCode內存警告消息。

我猜我有一個內存泄漏的地方(即使即時通訊使用ARC)。我使用xCode調試工具的經驗不是很豐富,所以我開始在每種方法之後打印保留計數。

UIImage *img = //image from camera; 
img = [img normalize]; 
img = [img rotate]; // retain count increases :(
img = [img scale]; 
img = [img resize]; 

增加保留計數的唯一操作是旋轉。這是正常的嗎?

+3

請搜索「不要使用retainCount」。你應該能夠找到幾個StackOverflow的問題和文章,說:retainCount對於調試這類事情是不可靠的。改用儀器,特別是泄漏和物體分配儀器。 – 2012-03-19 17:55:49

+0

我終於用tje xcode profiler解決了這個問題。解釋內存使用圖我意識到我沒有內存泄漏,而是內存密集型操作。謝謝! – 2012-03-19 19:06:15

回答

2

增加保留計數的唯一操作是旋轉。這是正常的嗎?

很可能rotate函數中的UIGraphicsGetImageFromCurrentImageContext()調用最終會保留圖像。如果是這樣,它幾乎肯定會自動釋放圖像,以符合正常的Cocoa內存管理規則。無論哪種方式,你都不應該擔心。只要您的rotate函數本身不包含任何不平衡的retain(或alloc,newcopy)調用,您應該期望沒有泄漏。如果您懷疑有泄漏,最好使用儀器進行追蹤,而不是自己觀看retainCount

+0

感謝您的提示。你能告訴我,如果我操縱圖像的方式(將函數添加爲返回修改副本的類別)是處理的好方法,或者每個操作創建新圖像的事實都容易泄漏?也許我應該找到操縱當前圖像的方式,而不是製作和返回副本? – 2012-03-19 18:22:44

+0

我認爲這不太可能導致泄漏,但它仍然可能會導致內存不足。如果您創建大型圖像的多個副本,這些副本將使用內存,直到它們被釋放。從內存使用的角度來看,您最好將所有這些操作合併到一個單獨的轉換中,然後應用它。 – Caleb 2012-03-19 18:33:36

+0

謝謝,我發現我實際上沒有內存泄漏,而是一個非常內存密集的操作(這是我的標準化函數)。我設法減少該操作的內存使用情況,並且現在它的所有工作都正常運行。 – 2012-03-19 19:03:59