释放或不释放控制器

时间:2011-04-20 10:40:32

标签: objective-c ipad release-management

首先,对不起我的英语(我是西班牙语)和成为新手。我正在开发我的第二个用于学习的iPad应用程序,我在内存管理方面遇到了问题。我现在面对这个问题大约一个月了,所以我想也许这个伟大社区的一些专家可以帮助我一点。

我的情景是:

这是一个简单的电子书应用程序。我有一个主视图,用户可以从中打开两个模态视图。主要问题在于其中一个模态视图。在那里,我有一个管理所有页面的scrollview。现在,有12页。我试图释放所有东西等等,但是内存中仍然存在某些东西,因为在乐器内存不断增长,当我解开模态视图并返回时,经过几次,它会崩溃。页面是单独的xib,我用这个方法加载它们:

    - (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;

if (page >= MyNumberOfPages) return;

if ((NSNull *)controller != [NSNull null]) {

    NSString *className = [NSString stringWithFormat:@"Pagina%d", page];
    Class myClass = NSClassFromString(className);

    controller = [[myClass alloc] initWithNibName:className bundle:nil];

// I have tried autorelease and even retain] autorelease.

           [viewControllers replaceObjectAtIndex:page withObject:controller];

    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    if (page != 0){
    controller.view.tag = page;
    }else {
        controller.view.tag = 9999;
    }

    [scrollView addSubview:controller.view];
    [scrollView sendSubviewToBack:controller.view];

            [controller release];


    }
}

我每次加载3页,一页可见,左右两页。我尝试以这种方式卸载(移除或移除)它们(对于3个加载的那些):

[viewControllers removeObjectAtIndex:pagi - 2];
[[scrollView viewWithTag:pagi - 2] removeFromSuperview];

所以我有两个问题......如果我按照上面的方法释放控制器,我的某些页面中的IBActions会使应用程序崩溃。但是,如果我无论如何都要发布它,并删除IBActions,那么内存也会不断增长。在仪器中,它没有泄漏,但在增加1mb或2mb的内存后崩溃。

我已经记录了所有页面viewDidUnload和deallocs,只有在有内存警告时才会卸载它们。

最后,对我来说更奇怪的是,如果我不使用[控制器发布];应用程序可以保持更长时间而不会崩溃。但是,当然,他们没有dealloc。

我认为问题可能在于此方法,但如果有帮助,我可以上传更多部分代码。只是不要在这里做太长时间。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

嘿,豪尔赫。 首先我要说你的英语不错。我来自瑞士,如果你没有说你是西班牙人,我就不会注意到它。 ; - )

总的来说,我可以说你必须在应用程序的这一点上释放控制器。上面几行,你打电话

[[myClass alloc] initWithNibName:className bundle:nil];

所以你必须释放它,因为你分配了它。如果您使用alloc,retain或copy,则您有责任释放这些对象。

但我猜你的问题是什么。你是如何定义controller的?它是iVar还是属性?如果它是属性,则存在内存管理问题,因为未释放“旧”值。在这种情况下,请使用self.controller代替controller

否则我无法想象为什么应用程序崩溃只有这个代码可用。 ; - )

Sandro Meier