Objective c Nib创建的视图保留文件';的所有者阻止取消分配UIViewController

Objective c Nib创建的视图保留文件';的所有者阻止取消分配UIViewController,objective-c,ios,cocoa-touch,uiviewcontroller,nib,Objective C,Ios,Cocoa Touch,Uiviewcontroller,Nib,我有一个视图控制器,我想释放它(然后可能在以后的应用程序中重新分配)。问题在于,它的视图似乎包含对它的强烈引用,如下面的堆栈跟踪所示。视图是否需要在视图控制器之前解除分配?如果是,我该怎么做?谢谢你的帮助:) 代码: 从覆盖的回溯-(id)保留 更改[self.rvc release]至[rvc发布]: - (void)setCurrentCourse:(Course *)newCourse {     // area of concern     if (currentCourse == ni

我有一个视图控制器,我想释放它(然后可能在以后的应用程序中重新分配)。问题在于,它的视图似乎包含对它的强烈引用,如下面的堆栈跟踪所示。视图是否需要在视图控制器之前解除分配?如果是,我该怎么做?谢谢你的帮助:)

代码:

从覆盖的回溯-(id)保留


更改
[self.rvc release]
[rvc发布]

- (void)setCurrentCourse:(Course *)newCourse {
    // area of concern
    if (currentCourse == nil) {
        [self.rvc.view removeFromSuperview];
        [rvc release];
        // HERE I want rvc to be deallocated, but the retainCount is one.
    } else {
        // This is where I allocate the rvc instance
        rvc = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle] courseSelectionController:self];
        [self.view addSubview:self.rvc.view];
    }
}
或使用
self.rvc=nil
和使用

rvc=[[RootViewController alloc]initWithNibName:@“RootViewController”bundle:[NSBundle mainBundle]课程选择控制器:self]

而不是


self.rvc=[[RootViewController alloc]initWithNibName:@“RootViewController”bundle:[NSBundle mainBundle]courseSelectionController:self]

假设
rvc
是一个保留属性,您有泄漏。这就是控制器未被解除锁定的原因。创建视图控制器时,您将过度保留它:

self.rvc = [[RootViewController alloc] initWithNibName:...];
alloc
返回保留的对象(+1)。然后,属性设置器还保留对象(+2)。稍后,当您释放(-1)对象时,将得到+1

要解决此问题,请使用临时变量或自动释放:

self.rvc = [[[RootViewController alloc] initWithNibName:...] autorelease];

另一个问题是释放属性所持有对象的方式:

[self.rvc release];
在此语句之后,您已经放弃了对象的所有权,并且没有任何东西可以保证该对象在将来是有效的,但是您的属性仍然保留指向它的指针。换句话说,您有一个潜在的悬空引用。因此,在使用这条语句释放属性时将其置零(这将释放旧对象):


你能告诉我你在哪里使用视图控制器吗?谢谢你的回答。我的问题依然存在。
[self.rvc release]
有什么问题?请尝试更改
self.rvc=[[RootViewController alloc]initWithNibName:@“RootViewController”bundle:[NSBundle mainBundle]courseSelectionController:self]
to
rvc=[[RootViewController alloc]initWithNibName:@“RootViewController”bundle:[NSBundle mainBundle]课程选择控制器:self]也是.self。调用自动生成的setter代码,该代码保留传递的任何内容,因此,分配某些内容,然后将其发送到self.property,将使其保留计数为2,而不是您想要的1。有关更详细的解释,请参见albertamg的答案。谢谢。那么…我应该重新命名我的问题吗不客气。我认为你不应该重新命名你的问题,因为它反映了你最初的想法。
self.rvc = [[[RootViewController alloc] initWithNibName:...] autorelease];
[self.rvc release];
self.rvc = nil;