Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 通过AddSubView添加的子视图viewcontroller是否需要解除锁定?_Iphone_Dealloc_Addsubview - Fatal编程技术网

Iphone 通过AddSubView添加的子视图viewcontroller是否需要解除锁定?

Iphone 通过AddSubView添加的子视图viewcontroller是否需要解除锁定?,iphone,dealloc,addsubview,Iphone,Dealloc,Addsubview,通常,当我使用的viewcontroller会将当前的viewcontroller推到一边时,我会使用UINavigationController并推/弹出新的viewcontroller,让它们自己处理所有的解除锁定 但是,例如,在本例中,我有一个MainViewController,它是应用程序启动时的默认视图。我有第二个视图,叫做SecondaryViewController,它是主屏幕上的一个弹出窗口(有点像灯箱) 下面是用于说明的代码: //From within mainViewCo

通常,当我使用的viewcontroller会将当前的viewcontroller推到一边时,我会使用UINavigationController并推/弹出新的viewcontroller,让它们自己处理所有的解除锁定

但是,例如,在本例中,我有一个MainViewController,它是应用程序启动时的默认视图。我有第二个视图,叫做SecondaryViewController,它是主屏幕上的一个弹出窗口(有点像灯箱)

下面是用于说明的代码:

//From within mainViewController:
secondaryViewController = [SecondaryViewController alloc] initWithNibName:@"SecondaryViewController" bundle:nil]; 
[self.view addSubview:secondaryViewController.view];
secondaryViewController界面如下所示:

//interface
@interface SecondaryViewController : UIViewController
{
    IBOutlet UILabel *httpLabel;
    IBOutlet UIScrollView *scrollView;
}
@property(retain, nonatomic) IBOutlet UILabel *httpLabel;
@property(retain, nonatomic) IBOutlet UIScrollView *scrollView;
-(void)setHttpLabel:(UILabel *)newlabel
{
  if (newLabel != httpLabel)
  {
    [httpLabel release];
    httpLabel = [newLabel retain];
  }
}
至于实现,对于
@属性
ivar,我有
@synthesis
,但我没有做任何手动alloc。然而,我确实提出了一个dealloc方法:

- (void)dealloc
{
    [httpLabel release];
    [scrollView release];
    [super dealloc];
}
但我不确定我是否需要上面的内容

因此,我的问题如下:

1) 在这种情况下,我需要上面的dealloc方法吗?或者更一般地说,子视图何时需要dealloc方法

2) 如果我需要或不需要它,是否取决于我是通过addSubview还是pushViewController添加secondaryViewController?例如,如果我想用以下内容替换整个mainViewController:

[self.navigationController pushViewController:secondaryViewController animated:NO]
secondaryViewController是否需要dealloc方法


谢谢大家!

如果在将视图添加到层次结构后需要从主视图控制器访问
secondaryViewController
,则不应在此时取消分配该视图控制器。如果在显示辅助控制器后不需要访问它,可以在该点解除锁定


实际上,如果
secondaryViewController
是一个ivar,那么保留对它的引用可能是有意义的。如果它是一个局部变量,您以后不能访问它,您应该解除锁定。

我认为这在最新的iOS 5+中是允许的,但以前您不应该向主viewcontroller添加另一个viewcontroller视图。这显然是误用,可能会导致问题

viewcontroller的概念是控制所有视图的人。视图控制器不应控制另一个视图控制器,除非它是容器视图控制器,如UINavigationController/UITabBarController

因此,请重新考虑设计。为什么需要第二个ViewController。为什么mainviewcontroller不能同时管理次视图


最后,每个viewcontroller中都应该包含dealoc。

是的,在本例中,您确实需要与现有方法完全相同的dealoc方法。您走在正确的轨道上,因为您假设,由于您没有进行任何手动分配,您不需要进行任何解除锁定/释放。。。但是,通过将属性指定为(retain,nonatomic),可以执行隐式保留

这意味着,如果您设置了这些属性,那么封面下实际发生的情况如下所示:

//interface
@interface SecondaryViewController : UIViewController
{
    IBOutlet UILabel *httpLabel;
    IBOutlet UIScrollView *scrollView;
}
@property(retain, nonatomic) IBOutlet UILabel *httpLabel;
@property(retain, nonatomic) IBOutlet UIScrollView *scrollView;
-(void)setHttpLabel:(UILabel *)newlabel
{
  if (newLabel != httpLabel)
  {
    [httpLabel release];
    httpLabel = [newLabel retain];
  }
}
如您所见,您的合成正在导致对象上发生保留。如果你从来没有平衡的保留与释放,它会泄漏。因此,唯一合乎逻辑的地方就是你的dealloc方法。这创造了生命的循环

如果您从未设置这些属性,并且在dealloc中没有发布,那么它不会泄漏任何内容,但您显然不想做出这些假设

如果您没有任何retain属性或IVAR的任何手动分配,那么也只有这样,您才能使用dealloc方法


希望能有所帮助。

谢谢。然而,我的问题是,我是否需要在secondaryViewController中使用dealloc()方法。我认为,如果我将子视图的每个逻辑放在它们自己的视图控制器中,它会更干净、更模块化。我实际上有3个子视图(每个都有控制器),每个都有不同的逻辑,需要在其中处理。将所有逻辑放在一个mainviewcontroller中是否更好?会出现什么样的问题?