Objective c 释放或不释放控制器

Objective c 释放或不释放控制器,objective-c,ipad,release-management,Objective C,Ipad,Release Management,首先,我为我的英语(我是西班牙人)和作为一个新手感到抱歉。我正在为learnign开发第二个iPad应用程序,内存管理有问题。我现在面临这个问题已经有一个月了,所以我想也许这个伟大社区的一些专家可以帮我一点忙 我的设想是: 这是一个简单的电子书应用程序。我有一个主视图,用户可以从中打开两个模态视图。主要问题在一个模态视图中。在那里我有一个scrollview来管理所有的页面。现在有12页。我试图释放一切,等等,但有些东西仍然留在内存中,因为在仪器中,内存不断增长,当我错过模态视图并返回时,在几次

首先,我为我的英语(我是西班牙人)和作为一个新手感到抱歉。我正在为learnign开发第二个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];


    }
}
所以我有两个问题。。。如果我按照上述方法释放控制器,我在某些页面的iBaction会使应用程序崩溃。但如果我还是释放它,并删除iActions,内存也会不断增长。在仪器中,它显示没有泄漏,但在增加1mb或2mb内存后崩溃

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

最后,对我来说更奇怪的是,如果我不使用[控制器释放];这些应用程序停留时间更长,不会崩溃。但是,当然,他们不会放弃

我认为这个方法可能有问题,但是如果它有帮助,我可以上传更多的代码。只是不要在这里呆太久

有什么想法吗?

嘿,乔治。 首先我得说你的英语不错。我来自瑞士,如果你没有说你是西班牙人,我不会注意到的

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

[[myClass alloc] initWithNibName:className bundle:nil];
所以你必须释放它,因为你分配了它。如果您使用alloc、retain或copy,则您有责任释放这些对象

但我猜你有什么问题。您是如何定义控制器的?它是iVar还是财产?如果它是一个属性,那么内存管理就有问题,因为“old”值没有释放。在这种情况下,使用
self.controller
而不是
controller

否则,我无法想象为什么应用程序在只有这段代码可用的情况下崩溃。;-)


桑德罗·梅尔

非常感谢桑德罗。控制器在@interface中定义为UIViewController*控制器;但不是@property。在这种情况下,我的示例对你没有帮助。^^我不明白它为什么会崩溃……不管怎样,任何答案都是非常有用的。但即使上面的代码是正确的,如果我在那个时候释放控制器,我在nibs加载中的iBaction也会崩溃。我已经读到这是正常的,因为我试图发送一个动作给一个已经被释放的对象,对吗?但是我如何才能释放它并保持IBActions正常工作?有没有办法做到这一点,或者我要求的太多了?通常[viewControllers replaceObjectAtIndex:page withObject:controller]会保留该对象,因为它在该数组中使用。所以奇怪的是你的控制器被释放了…谢谢桑德罗。关于replaceObjectAtIndex,您所说的注意到代码在某些方面是多余的,但我认为(正如您所说的)错误不在这个方法中。现在,我的应用程序在长时间工作后才崩溃,所以我认为这是“次要的”,但它仍然存在。我会继续寻找,如果我找到了解决方案,我会把它贴在这里。
[[myClass alloc] initWithNibName:className bundle:nil];