【发布时间】:2011-05-27 12:17:33
【问题描述】:
这会影响我与模态控制器的交互方式。当我第一次开始 iOS 开发时,我认为 UIViewController 没有保留模态呈现的视图。好吧,实际上这更像是我没有理由假设它确实保留了它们。当我知道他们会完成他们的解雇动画时,这让我在释放他们时尝试着相当尴尬:
_myViewController = [[UIViewController alloc] init];
[self. present modalViewController:_myViewController animated:YES];
/*
Some stuff, then in a different method all together,
probably as the result of a delegate callback or something...
*/
[self dismissModalViewControllerAnimiated:YES];
[_myViewController performSelector:@selector(release) withObject:nil afterDelay:0.5f];
然后,我看到UIViewController 的modalViewController 属性并想,“伙计,我希望它在显示模态视图控制器时保留该属性。”果然,我记录了其中几次尝试的保留计数,并注意到在调用 presentModalViewController:animated: 后立即普遍增加(我知道,保留计数不是一个完美的指标)。所以,在某个地方,我已经开始使用一个更好的模式,我假设我以模态方式呈现的任何控制器对象都由呈现控制器保留。这让我可以编写标准的当前代码:
UIViewController* myViewController = [[UIViewController alloc] init];
[self presentModalViewController:myViewController animated:YES];
[myViewController release]; // <- Fire and forget!
现在,当然,没有尴尬:无需等待动画完成,甚至在不需要时保留对呈现控制器的引用。我可以稍后盲目地关闭它,而不用担心泄漏。我喜欢。
我在模态呈现的控制器中记录了许多 dealloc,它们总是在我想要的时候准确地被调用,这让我对我的方法充满信心:UIViewController 的 presentModalViewController:animated: 将呈现的控制器保留为 @987654329 @属性。
但是,这就是这个问题的实质,我意识到我无法确认这是记录的行为。如果它没有被记录在案,我不应该像我一样感到安全,因为苹果没有承诺无证行为的寿命。 modalViewController 属性是公开的 readonly,所以我只能假设在幕后保留,presentModalViewController:animated: 上的文档只说:
将 modalViewController 属性设置为指定的视图控制器。
“集合”可以是assign 或retain。我读到的任何东西都没有公然证实或否认我的立场。由于这是我经常做的一个假设,如果有人能指出我在文档中遗漏的某个地方,让我对这种做法的合法性放心,我会非常高兴。
编辑:在 iOS SDK 日常生活的起起落落中,我发现自己在 UIViewController 的标题中并开始阅读其中的一些内容。我收集了一些有用的信息,让我想起了这个问题,我决定发布它,以防将来的一些用户偶然发现这个问题并想要尽可能多的信息来满足他们对非常标准做法的偏执。一点点就是这样,来自 UIViewController.h 中的 @interface ivar 块:
UIViewController *_childModalViewController;
与其他声明相反:
UIViewController *_parentViewController; // Nonretained
NSHashTable *_childViewControllers; // Nonretained
cmets 似乎明确说明了不保留的内容。由于缺少对模态视图控制器 ivar 声明的注释,它似乎 被保留了。
【问题讨论】:
-
这里有同样的问题。有人可以帮忙吗?
标签: iphone objective-c ipad uiviewcontroller