作者yllan (蓝永伦)
看板MacDev
标题Re: [quiz] NSImage's leak
时间Thu Mar 9 21:23:19 2006
※ 引述《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