Objective c 保留UIViewController';s、 查看,然后释放VC,VC获取dealloc';D

Objective c 保留UIViewController';s、 查看,然后释放VC,VC获取dealloc';D,objective-c,ios,uiviewcontroller,Objective C,Ios,Uiviewcontroller,我正在创建一组UIViewControllers,用于管理多个自定义对象。虽然我真的不需要从创建“UIViewController”的地方直接访问它。我想将viewController.view添加到我的主UIViewController视图中。然后释放子ViewController。SubViewController中有一个手势识别器,当我执行手势时,我会收到一条发送到解除分配实例的消息 这是我的密码 [...snip...] for (int elementForPageTypeIn

我正在创建一组
UIViewControllers
,用于管理多个自定义对象。虽然我真的不需要从创建“UIViewController”的地方直接访问它。我想将viewController.view添加到我的主UIViewController视图中。然后释放子ViewController。SubViewController中有一个手势识别器,当我执行手势时,我会收到一条发送到解除分配实例的消息

这是我的密码

[...snip...]
    for (int elementForPageTypeIndex = 0 ; elementForPageTypeIndex < elementsOnPage; elementForPageTypeIndex ++){


            IoUIElementPickerElementButtonViewController * element = [[IoUIElementPickerElementButtonViewController alloc] initWithNibName:@"IoUIElementPickerElementButtonViewController" bundle:nil];

            pageColumn = (elementForPageTypeIndex)%2 ;
            pageRow = roundf((elementForPageTypeIndex)/2);

            CGRect elementFrame= CGRectMake(kElementPickerColumnLeftOffset + (element.view.frame.size.width + kElementPickerColumnSeperation)*pageColumn + pageIndex*kElementPickerColumnPageOffset,
                                            kElementPickerRowTopOffset +  (kElementPickerRowSeperation + element.view.frame.size.height) * pageRow,
                                            element.view.frame.size.width,
                                            element.view.frame.size.height);

            [element.view setFrame:elementFrame];

            SysCDElement *ourCDElement = [elementsForPage objectAtIndex:elementForPageTypeIndex + maxElementsPerPages * pageIndex];

            [scrollViewContent addSubview:element.view];
            [element release];

    }
[...snip...]
[…剪断…]
for(int-elementForPageTypeIndex=0;elementForPageTypeIndex
发布之后,
元素
的dealloc立即运行。我想如果我保留了viewController的视图,那么viewController本身也会保留吗


谢谢,没有。如果保留UIViewController的视图同时神奇地保留UIViewController,那将非常可怕


经验法则是,如果你需要什么东西来维持生命,你就保留它。如果你仍然需要它,就永远不要释放它。指望其他类来保留它是不可靠的。如果你想让控制器留在附近,不要松开它。

说得好。通常,“保留”在这里的意思是“粘贴在保留ivar中”。谢谢,这是视图控制器的质量感。关于常规视图的经验法则。这条规则也适用吗?例如。我创建了一个工具栏,上面有6个按钮。根据事件的不同,我想更改其中一个按钮项目的图标。我通常创建按钮,设置属性,添加到项目数组,然后发布。我在这里也做了同样的事情,尽管我保留了指向BartButton项的iVar,知道工具栏保留了它,即使我发布了我创建的版本。这可以接受吗?@scooter133,这取决于上下文。如果您以后引用了bar button项,并且对它所代表的内容有一定的期望,那么您应该保留对它的引用。如果您只想设置工具栏项目,然后按照自己的方式进行,那么可以创建它们,然后将概念所有权转移到工具栏。我正在更改图标图像,请考虑锁定/解锁图标图像。另一种情况与此类似。我正在添加一个子视图,其中将包含自定义VC的手势识别器。如果要启用手势识别,则启用/禁用此视图。它作为子视图添加到我的主VC视图中。在我将它添加到vc.view之后,我发布了它,尽管在其他地方使用了ivar名称,因为我知道vc.view保留了它。所以你是说我应该保留它,然后在我的dealloc中释放它。我只是想,因为我的视图会在那里,它也会在那里,所以我在添加它之后释放它。@scooter133,是的,你应该保留视图。确实,您可以释放视图而不崩溃,因为您知道父视图保留了它。缺点是对子视图的引用只有在父视图仍然存在时才有效。有一些微妙的错误正在等待发生。很有可能您会没事,但与不断确保应用程序处于给定ivar实际上是有效引用的状态相比,始终保留您稍后引用的对象是更好的策略。