2011-09-02 29 views
0

我有一个ivar,它是UIPopoverController。当它被解雇时,我想清理内存。当popover被取消时,或者当弹出窗口已经呈现给用户时,如果用户按下BarButtonItem,我会调用以下方法。将对象参数设置为零Objective-C

- (void)popoverCleanup:(UIPopoverController *)popoverController { 
    popoverController.delegate = nil; 
    popoverController = nil; 
} 

我设置一个断点,并试图下面的代码,并在寻找记忆。我看到我的ivar Popover和方法参数popoverController都指向相同的内存地址。当我点击第一行时,我看到Popover和popoverController参数上的委托设置为零。但是,当我到达该方法的结尾时,我只看到popoverController的内存设置为零,而IVAR弹出窗口未设置为零。是否有一个原因?

谢谢。

回答

2

通过这样做,你只是说你不想保存一个popoverController指针,不管它指向什么。没有什么可以在这里发布。释放popover的正确方法是实现它的委托方法,用于解除和释放它。

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    [popoverController release]; 
} 

请记住,将ivar设置为nil不会释放ivar指向的对象,它通常会泄漏它。你只能使用复制或保留的属性来做到这一点,因为它们的工作原理是保留或复制新值(nil,保留或复制时不做任何事情,因为它不是真正的对象)并释放旧值。在发布之后,您应该只将伊娃设置为,以便稍后意外发送消息时,您不会因访问已释放的内存而崩溃。

编辑:也请记住,如果您只想呈现popover并释放它,那么真的不需要ivar。只需创建一个局部变量并显示一个弹出窗口。一旦委托方法被调用,它将有一个指向popover对象的指针,不需要为此只保留伊娃。如果你想创建并呈现多次,只需要永久使用它就可以释放它,就像离开视图控制器时一样。

+0

如果我做一个检查,如果(Popover ==零),与contentViewController分配popover,然后在我的清理,我将不得不将它设置为零后释放权? – Crystal

+0

此外,之所以我认为你需要一个弹iv伊维尔是因为如果你不止一次地按下BarButtonItem,另一个弹出会显示在它上面。所以我试图跟踪我是否已经提交了该项目,如果是,请不要提交。 – Crystal

2

这是因为popoverController和你的实例变量不是同一个变量,即使它们指向相同的事物(在将它设置为nil之前它们是同一个指针实例)。

在该方法(- (void)popoverCleanup:(UIPopoverController *)popoverController)中,您需要将实例变量设置为nil而不是popoverController变量。此外,如果你还没有,你需要释放你的popover,它应该设置实例变量为零,如果没有其他东西保留它

1

应该注意的是,将实例变量设置为nil不会释放指向的对象。

如果要释放该对象,最简单的方法是将其作为属性进行管理并将该属性设置为零。请注意0​​与self.popoverController = nil;不一样。前者将INSTANCE VARIABLE设置为零。后者将PROPERTY设置为零,并且如果该属性使用“保留”来定义,那么所寻址的对象将被释放。

相关问题