无法在函数中释放ViewController

时间:2011-09-16 08:48:45

标签: objective-c ios ipad

为什么我不能在功能结束时使用[y release]

- (void)functionused:(NSTimer *)timer
{   
    [password resignFirstResponder]; 
    mainViewController* y=[[mainViewController alloc]initWithNibName:@"mainViewController" bundle:nil];
    UIView *currentView = (UIView *)[timer userInfo];

    for ( UIView *subview in [self.view.superview subviews] ) {

        if ((subview.tag != 14)) {

            [subview removeFromSuperview];
        }
    }
    [currentView.superview addSubview:[y view]];

    //[y release];
}

2 个答案:

答案 0 :(得分:4)

因为这会使mainViewController的引用计数为零,并且它将被释放。你需要在某处保持对它的引用。

[currentView.superview addSubview:[y view]];行只会将其视图添加到超级视图中。视图将被保留,但控制器本身不会。

答案 1 :(得分:2)

在这种情况下,您需要了解UIView和UIViewController之间的区别。 UIViewController包含一个指向UIView实例的指针,但UIView不包含对UIViewController的直接引用。因此 - 当您将视图控制器的视图添加到currentView的超级视图时,它会保留计数增量。但是,这不会增加视图控制器的保留计数。如果被释放它将变为0,这将导致视图控制器被释放。