【问题标题】:PageViewController: How to release ViewControllers added to it?PageViewController:如何释放添加到它的 ViewControllers?
【发布时间】:2011-10-28 20:07:45
【问题描述】:

我对新的 PageViewController(具有漂亮翻页动画的那个)有疑问。据我了解,您需要像这样设置一堆 ViewController:

PageView *startingViewController = [self.modelController viewControllerAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];

到目前为止一切顺利。然后你需要设置一个源(你的模型控制器)。在你的模型控制器中,你需要有四个方法:

-(PageView *)viewControllerAtIndex:(NSUInteger)index
-(NSUInteger)indexOfViewController:(PageView *)viewController
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController

如果您翻页(到下一页或上一页),则会调用最后两个。第二个简单地确定页面索引号。有趣的是——也是我的问题所在——是第一个。第一个返回一个 ViewController(在我的示例中称为 PageView)。这是方法的最后:

PageView *pView = [[PageView alloc] init];
return pView;

我想知道这个 pView 在哪里结束以及如何释放它?我想 autorelease 是个坏主意,因为我不知道需要多长时间。如果它最终在堆栈中(我猜它确实如此),它需要多长时间?当然只是接下来的几页。例如,想象为第 1 页设置一个 pView。然后您转到第 2 页和第 3 页。到那时您不再需要第 1 页 - 您可以释放它。如果您返回到第 1 页,它将被重新加载。

我将日志命令放在我的 pView dealloc 中,但它从未被调用。所以我想我会泄露我创建的每一个视图控制器。

有什么想法可以在不再需要它们时如何以及在何处释放它们?

【问题讨论】:

    标签: iphone objective-c cocoa-touch uiviewcontroller ios5


    【解决方案1】:

    autorelease 正是您所需要的。这是 autorelease 设计的完美情况,即您需要返回一个对象但不知道需要多长时间。

    PageView *pView = [[PageView alloc] init] autorelease];
    return pView;
    

    您的 PageView 实例分配在堆上(而不是堆栈),并且 PageViewController 将取得它的所有权并在需要保留它时保留它。在您的方法返回后,它就成为 PageViewController 的职责。

    (否则只使用ARC,让编译器处理)

    【讨论】:

    • 现在就像一个魅力。我只是很困惑,因为 Apple 没有在他们的 PageBasedApplication 故事板前版本中使用自动发布。在 xCode 4.2 中,他们废弃了我正在使用的示例,并将其替换为情节提要模板。但我还不能被故事板打扰......所以非常感谢!
    • ARC 没有处理它。不释放未使用的视图控制器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多