一些内存管理理解

时间:2011-12-28 16:03:42

标签: iphone objective-c ios cocoa ipad

我创建了一个viewController的属性,并从viewController的ClassB(Class A)中保留它。

所以基本上我有@property(非原子,保留)ClassAViewControllerVC,并在主文件中合成。

我有一个IBAction,我在其中分配ClassAViewController并将其推送到导航堆栈,但我试图分析我应该在哪里发布这个viewController?

- (IBAction) response {

 ClassAViewControllerVC = [ClassAViewController alloc] initWithNib:@"ClassAViewController" bundle:[NSBundle mainBundle]];

 [self.navigationController pushViewController:self.ClassAViewControllerVC animated:YES]

}

如上所述,我将视频控制器堆叠在导航控制器上后,是否可以将其释放?

另外,首先为这样的viewController设置属性是个好主意吗?我开始注意到,如果没有使用@property保留方式我的应用程序开始崩溃。任何想法或关注将不胜感激。

由于

3 个答案:

答案 0 :(得分:3)

首先,不,没有必要将这样的对象保留在属性中。如果类稍后需要访问该对象,则只需要将对象保留在属性中。在这种情况下,我认为局部变量会这样做。

在此示例中,您使用ClassAViewController创建alloc,这意味着调用者(此方法)有责任在完成后释放它。

当您将其添加到导航控制器堆栈时,导航控制器会保留它,因为它会保留对它的引用。

因此,在此方法结束时,您应该释放它,但它已被导航控制器保留,因此它不会被删除。

代码应如下所示:

- (IBAction) response {
    ClassAViewController *viewController = [ClassAViewController alloc] initWithNib:@"ClassAViewController" 
                                                                             bundle:[NSBundle mainBundle]];

    [self.navigationController pushViewController:viewController animated:YES]

    [viewController release];
}

P.S。在objective-C中使用以小写字母开头的变量名称。大写的起始字母用于类名,它让我感到困惑! ;)

答案 1 :(得分:0)

如果ClassAViewControllerVC是ClassB的一个字段,你应该在dealloc方法中释放它。

但你应该在init中创建ClassAViewControllerVC甚至更好的viewDidLoad方法。(注意:如果你在viewDidLoad中创建一些东西,你需要释放它的viewDidUnload,不仅仅是在dealloc中)

因为现在每次"回应"方法被称为ClassAViewControllerVC将重新创建。 (并且没有太多意义将其存储在财产中)。如果这是您想要的,您可能不应该将ClassAViewControllerVC作为ClassB的归档,但只需将它作为本地变量的响应方法,如下所示:

- (IBAction) response {
    ClassAViewController *classAViewController = [ClassAViewController alloc] initWithNib:@"ClassAViewController" bundle:[NSBundle mainBundle]];

    [self.navigationController pushViewController:classAViewController animated:YES];
    [classAViewController release];

}

答案 2 :(得分:0)

解决此问题的最佳方法是将空UIViewController拖放到ClassB.xib文件中。创建@property(非原子,保留)ClassAViewControllerVC,建立连接到空UIViewController,您只需删除到classB.xib文件,并将NIB名称更改为类A nib文件名。这将解决所有崩溃问题,因为您没有分配或释放任何内存。