Re: [quiz] NSImage's leak
※ 引述《yllan (藍永倫)》之銘言:
: ※ 引述《anpig (安得列)》之銘言:
: : 這樣看來,除了NSImage以外還有哪些物件也是如此?
: : 或是說,為什麼會有這樣的設計?
: 沒有辦法,obj-c 裡面記憶體得自己管理,為了維護一些 principle
: 所以才有 autorelease 這種東西出來。
: (當你要回傳一個東西給別人,你要把擁有權交給別人,只能 delay release
: 要不然東西可能會不見)
: 別人若是使用,可以 retain 他,但若不用呢?你不能做任何事情,
: 只能等回到 application runloop 才會被 autorelease pool 給清除。
: (不然就是重複 release 了)
: ... 回家補完
NSImage 的生成比較複雜,內部要和什麼 NSImageRepresentation 之類的綁一起,
在初始的時候可能就會叫用別的 class ,之間產生沒有主人的 autoreleased 物件
就會積一堆了。只能說無奈。因為嚴格說起來這不算問題~下面兩種寫法你會寫哪個?
img = [NSImage imageWithPath: path]; ...1
img = [[NSImage alloc] initWithPath: path]; ...2
[img release];
當然是 1 啦,2 的話不僅寫起來長,要是忘記 release 又會造成 memory leak...
嗯,懶惰違背了記憶體管理的 priciple ,難怪。
其實解法就是多用 profiling tools, 大量記憶體調用的迴圈內手動加 release pool,
當初我沒見識,不知道蘋果已經在記憶體管理的文件上提過這點還野人獻曝,
(Obj-C 的文件沒有,是另外一份專講 Memory Management 的)自以為發現一個
問題。不過這個問題真的不只困擾我而已,外國佬也發生過,應該算是個要注意的
地方啦~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.31.131
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 11 篇):