在IBOutlet(UIImageView)之后释放内存

时间:2012-10-24 07:31:47

标签: ios memory-management iboutlet

我在IBOutlet中有一个UIImageView* ViewController。在释放Controller之后(我不再需要它),UIImageView * keepCount为2(代码没有任何保留),甚至在释放两次之后[我认为,这完全错误](在Controllers中{ {1}})dealloc内存仍然分配。为什么会发生这种情况,我的问题是 - 如何在UIImageViewUIViewController取消IBOutlets之后完全释放内存?

@interface GRULogInController (){
    IBOutlet UIImageView* bgImage;
}
@end
@implementation GRULogInController
....

- (void)viewDidUnload
{
    NSLog(@"%d", bgImage.retainCount); // Shows 2 !!!
    [bgImage release];
    [bgImage release]; // Object releases but memory not freed (It shown in Instruments)

    [super viewDidUnload];
}

- (void) dealloc
{
    [self viewDidUnload];
    [super dealloc];
}

2 个答案:

答案 0 :(得分:1)

首先来看看这个链接。 whentouseretaincount.com
它只是没有告诉任何有用的东西。

其次,iOS在需要内存时清除viewControllers,而不是在释放viewController后立即清除它 你不应该释放imageView两次,让viewController处理它。

另一件事是不推荐使用viewDidUnload,而应该在dealloc中执行代码。

答案 1 :(得分:0)

  

UIImageView *的retainCount为2

你怎么知道的?请不要依赖retainCount。仍然:

1 - 您的IBOutlet参考。

2 - 您的UIView作为其子UI元素的强引用。

所以你去了,你的retainCount 2(理论上)。

使用仪器检查是否有内存泄漏。此外,正如Frederik指出的那样,不要使用viewDidUnload,不再需要它了。