2013-06-21 84 views
2

任何人都可以告訴我我在這裏有什麼問題嗎?方法返回一個核心基礎對象+1保留

Screenshot

+1

你編譯的ARC代碼ARC關閉? – dasblinkenlight

+0

毫無疑問,您正在'createCGImage'中創建一個圖像,然後永遠不會釋放它。 – borrrden

+0

@dasblinkenlight是的,我有土弧。 我使用imageTemp = [[UIImage imageWithCGImage:[上下文createCGImage:outputImage fromRect:outputImage.extent]] autorelease];但會得到警告「Object sent -autorelease too much times」 – bachle26

回答

6

即使你可能已啓用ARC,只涵蓋可可/ Objective-C對象。 Core Foundation and Core Graphics API's are different,並且您仍然需要最終顯式釋放所創建的任何對象的內存。

在您的代碼中,您正在執行沒有均衡版本的「createCGIImage:」。

一個版本是這樣的:

CGImageRelease(myImageRef) 

所以,這樣做的權利,這樣做:

CGImageRef myImageRef = [context createCGImage: outputImage fromRect: outputImage.extent]; 
UIImage * imageTemp = [UIImage imageWithCGImage: myImageRef]; 
CGImageRelease(myImageRef); 
+0

對我來說太快了! +1 – borrrden

+0

謝謝你的幫助 – bachle26

1

ARC是無關緊要的,你正在處理一個的CoreFoundation對象。您需要將其分配給CGImageRef變量,然後使用CFRelease(variableName)釋放它。

CGImageRef cgImage = [context createCGImage:...]; 
// rest of your code here 
CFRelease(cgImage); 
1

[context createCGImage:fromRect:]方法返回一個保留CGImageRef。該解決您的內存泄漏,你需要保存到CGImageRef參考,並釋放它,當你用它做:

CGImageRef imageRef = [context createCGImage:outputImage fromRect:outputImage.extend]; 
imageTemp = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
相關問題