由于使用保留属性导致内存泄漏

时间:2011-04-28 11:38:32

标签: iphone objective-c memory-management memory-leaks

在我的几乎所有类中,我都使用属性,并且我总是使用这样的retain属性:

@property (nonatomic, retain) HomeViewController *homeViewController;

在实现文件中,我实例化了这样的属性:

self.homeViewController = [[HomeViewController alloc]init];

这是我发布的唯一地方:

- (void)dealloc
{
    [homeViewController release];
    [super dealloc];
}

我认为我在这里有内存泄漏是正确的 - 因为保留计数实际上是2.第一个来自属性保留而第二个来自alloc调用?

如果是,我应该在这种情况下使用转让吗?

3 个答案:

答案 0 :(得分:6)

是的,你有泄漏,是的,你的保留计数是2。

三种解决方案:

  • self.homeViewController = [[[HomeViewController alloc]init] autorelease];
  • homeViewController = [[[HomeViewController alloc]init];
  • UIViewController *temp = [[HomeViewController alloc]init]; self.homeViewController = temp; [temp release];

答案 1 :(得分:2)

是的,你确实有内存泄漏。它可以纠正如下:

self.homeViewController = [[[HomeViewController alloc]init] autorelease];

合成保留的属性会创建一个setter,该函数可以执行以下操作:

- (void)setHomeViewController(HomeViewController *)aHomeViewController
{
    if (![homeViewController isEqual:aHomeViewController]) {
        [homeViewController release];
        homeViewController = aHomeViewController;
        [homeViewController retain];
    }
}

合成的setter释放属性的旧值,并保留新值。因此,您的alloc'ed变量被保留两次:在alloc&在物业设定者。然后,它只在dealloc中被释放一次。

注意:我根据jv42和JeremyP的评论更正了上述代码。合成的setter首先有效地检查新值和旧值是否指向同一个对象。如果没有检查(就像我原来的那样),它可能会在设置属性之前释放HomeViewController对象并丢失它。

答案 2 :(得分:0)

您也可以使用self.yourObject = nil;在viewDidUnload方法中。