在我的几乎所有类中,我都使用属性,并且我总是使用这样的retain属性:
@property (nonatomic, retain) HomeViewController *homeViewController;
在实现文件中,我实例化了这样的属性:
self.homeViewController = [[HomeViewController alloc]init];
这是我发布的唯一地方:
- (void)dealloc
{
[homeViewController release];
[super dealloc];
}
我认为我在这里有内存泄漏是正确的 - 因为保留计数实际上是2.第一个来自属性保留而第二个来自alloc调用?
如果是,我应该在这种情况下使用转让吗?
答案 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
方法中。