当addSubview和release在添加的视图中无法正常工作时

时间:2013-06-17 10:22:42

标签: iphone ios objective-c ios4

我创建了Class,它使用非arc项目添加到当前视图中。之后我就像这样发布它。

  TestViewController *tView=[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
tView.view.frame=CGRectMake(10, 10,tView.view.frame.size.width , tView.view.frame.size.height);
[self.view addSubview:tView.view];
[tView release];

我向TestViewController添加了按钮,当按下它时,它会崩溃并从控制台查看此消息。

-[TestViewController performSelector:withObject:withObject:]: message sent to deallocated instance 

任何人都可以解释原因吗?

4 个答案:

答案 0 :(得分:2)

当您致电[tView release]; TestViewController时,dealloc方法会自动被调用。此类的Objects将为released。所以你可能已在dealloc中发布了该按钮。这就是你的应用程序崩溃的原因。

这不是正确的方法。 您应该创建自定义视图并将该视图添加到self.view,而不是添加viewcontroller的{​​{1}}。

答案 1 :(得分:0)

目前,您已将 TestViewController 实例声明为本地。因此,只有在访问实例中的控件时才会崩溃。

类级别(ivar)中声明 TestViewController 实例,然后使用它。

答案 2 :(得分:0)

显然,按钮的目标是tView。 [tView dealloc]在[tView release]之后被调用,因为其retainCount减少到0。 您应该将tView声明为私有成员变量,例如_tView,并在视图控制器的dealloc函数中调用[_tView release]。

@interface **
{
    TestViewController *_tView;
}

if(!_tView){
    _tView=[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
}
_tView.view.frame=CGRectMake(10, 10,tView.view.frame.size.width , _tView.view.frame.size.height);
[self.view addSubview:_tView.view];

在iOS 5. *中,支持自定义容器视图控制器。 (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html) 您可以编写如下代码:

TestViewController *tView=[[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
tView.view.frame=CGRectMake(10, 10,tView.view.frame.size.width , tView.view.frame.size.height);
[self.view addSubview:tView.view];
[self addChildViewController:tView];
[tView didMoveToParentViewController:self];
[tView release];

答案 3 :(得分:-1)

您可以使用以下代码

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(aMethod:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Show View" forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
    [self.yourViewController addSubview:button];

self.viewController意味着您已在.h文件中定义了viewcontroller,然后使用视图控制器的实例添加按钮。

然后你可以发布你的viewController [ViewController Release];