Iphone 添加不带navigationController的子视图时,请正确释放ViewController

Iphone 添加不带navigationController的子视图时,请正确释放ViewController,iphone,objective-c,ios,uiviewcontroller,retaincount,Iphone,Objective C,Ios,Uiviewcontroller,Retaincount,我经常遇到的问题是,在将ViewController.view作为子视图添加到导航控制器上时,无法正确创建和销毁ViewController 例如: MyViewController *myViewController = [[MyViewController alloc] init]; [currentView addSubView:myViewController.view]; [myViewController release]; 如果它是无控制器视图并且没有用户必须与之交互的u

我经常遇到的问题是,在将ViewController.view作为子视图添加到导航控制器上时,无法正确创建和销毁ViewController

例如:

MyViewController *myViewController = [[MyViewController alloc] init];  
[currentView addSubView:myViewController.view];  
[myViewController release];
如果它是无控制器视图并且没有用户必须与之交互的uicontrol,那么这非常有用。但是向该视图的视图控制器发送消息会导致执行错误访问,因为它们不再在内存中

MyViewController *myViewController = [[MyViewController alloc] init];  
[currentView addSubView:myViewController.view]; 
这在发送消息时起作用,但这是内存泄漏,被静态分析器捕获

将其设置为当前视图控制器的属性有时会起作用。但是,如果我需要创建一个包含未知数量MyViewController的集群,并将它们添加到UIScrollView之类的东西中,这也不起作用

for (int i = 0; i < [myViewControllers count]; i++) {  
    MyViewController *myTmpViewController = [[MyViewController alloc] init];
    [myCurrentUIScrollView addSubview:myTmpViewController.view];
    [myTmpViewController release];
}
for(int i=0;i<[MyViewController计数];i++{
MyViewController*myTmpViewController=[[MyViewController alloc]init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myTmpViewController发布];
}

如果myTmpViewController有用户交互或类似功能,仍然会崩溃。如何添加并正确释放它?

您可以在ivar中存储指向视图控制器的指针,然后在您的
dealloc
方法中释放它。

您可以拥有一个NSMutableArray并在那里添加控制器


for (int i = 0; i < [myViewControllers count]; i++) {  
    MyViewController *myTmpViewController = [[MyViewController alloc] init];
    [myCurrentUIScrollView addSubview:myTmpViewController.view];
    [myControllers addObject:myTmpViewController];
    [myTmpViewController release];
}

// ..

- (void) dealloc {
    [super dealloc];
    [myControllers release];
}


对于(int i=0;i<[MyViewController计数];i++{
MyViewController*myTmpViewController=[[MyViewController alloc]init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myControllers addObject:myTmpViewController];
[myTmpViewController发布];
}
// ..
-(无效)解除锁定{
[super dealoc];
[mycontroller释放];
}

< /代码> 如果这样的子视图具有有限的“控件需求”,那么您可以考虑从UIView中继承子类,并拥有视图控件本身(例如是它自己的委托)


否则,您需要确定这些viewcontroller(通常是parentview的viewcontroller)的最符合逻辑的“所有者”,并使它们成为其所有者的IVAR。

我更愿意在典型惯例允许的情况下尽可能接近MVC。