这是否必须发布?

时间:2010-03-18 20:37:50

标签: iphone memory sdk uiimageview memory-leaks

我已经做了很多关于何时释放东西的研究,但这对我来说都很困惑。我认为有时Leaks计划已经结束。总之...

background是一个UIImageView

background.image = [UIImage imageNamed:@"greenbackground.png"];

我必须发布背景吗?我从来没有分配它,也没有设置为属性,所以我没有想到。

3 个答案:

答案 0 :(得分:2)

实际上,你确实需要发布它。

UIKit使用键值编码将IBOutlets分配给控制器。默认情况下,这会导致控制器将保留计数增加1。从KeyValueCoding docs:

If you have not defined a setter, then UIKit will directly set the value of the instance variable and then, for anything other than an NSNumber or NSValue date type, UIKit will retain the value after autoreleasing the instance variable’s old value.

除非您使用assign明确设置@property,否则您需要释放该对象。

答案 1 :(得分:0)

不,不。该工厂方法返回一个自动释放的UIImage。一个好的经验法则可以帮助我实现目标c,无论何时你在方法名称中看到alloc,copy或new ...你都会释放返回的对象......其他一切都应该是一个自动释放的对象。另外,我不能想到api中没有返回自动释放对象的任何类级别方法(+)。

修改 我太快读了你的问题......马克对此是正确的。如果您对这些事情有疑问,可以随时进行简单的测试并记录保留计数。

答案 2 :(得分:0)

Mark是正确的,如果它是从nib实例化的,如果background是IBOutlet,并且background没有相应的“assign”属性,则负责释放你的UIImageView。

即使您正确管理,在释放UIImageView后,您仍可能会在ObjectAlloc中看到一些额外的内存。这是因为-[UIImage imageNamed:]缓存了您加载的图片,期待您稍后再次调用-[UIImage imageNamed:]。即使返回的UIImage被取消分配,图像也不一定是未缓存的。