我创建了一个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保留方式我的应用程序开始崩溃。任何想法或关注将不胜感激。
由于
答案 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文件名。这将解决所有崩溃问题,因为您没有分配或释放任何内存。