2010-09-11 56 views
0

我有两个观点,父视图打开弹出了,有一个子视图。分配目标C

在子控制器 @property(nonatomic,assign)ParentController * parent;

父控制器 ChildController * child = [[ChildController alloc] init]; child.parent = self;

我的问题是在子控制器的dealloc方法,你设置self.parent =零或释放?

+1

如果这些对象是UIViews,那么使用[self superview]从子级访问父级更安全。你不必担心谁保留谁。 – tidwall 2010-09-11 22:23:14

+0

实际上,子视图在UIPopOverController中。我无法直接从孩子访问它。 – Joey 2010-09-12 00:55:05

+0

如果你'正在呈现内'UIPopoverController',为什么要给它一个指针回'ParentViewController' ChildViewController'? – 2010-09-12 01:03:46

回答

3

这有一个坏的代码味道。它没有多大意义,我很惊讶,它编译:

ChildController *child = [[ParentController alloc] init]; 

而且我不知道你所说的“流行过”的意思 - 这个词有特定的含义,现在iOS中(参见: Consider Using Popovers for Some Modal Tasks在iPad人机界面指南中)。

你的问题“在子控制器的dealloc方法中,你设置self.parent = nil还是释放?无法正确回答,因为这也是一种不好的代码味道。没有理由让子视图控制器摆弄这样的父视图控制器的任何引用。

(虽然有些人已经回答了你的问题,我打字这件事,同时,我认为你有需要承认一些设计上的问题)你是如何展示你的“ChildView”

?模态?如果是这样,你的代码可能是这个样子:

- (void)showChildView 
{ 
    ChildViewController* childViewController = [[ChildViewController alloc] initWithNibName:@"ChildView" bundle:nil]; 
    childViewController.delegate = self; 
    childViewController.someProperty = @"Some Value"; 
    [self.navigationController presentModalViewController:childViewController animated:YES]; 
    [childViewController release]; 
} 

您应该然后创建您的ChildViewController类的委托协议,您ParentViewController类将实现,所以它知道什么时候ChildViewController完成,因此它可以处理移除适当的观点。

一般来说,ChildViewController需要一个返回到ParentViewController的指针的想法是一种不好的代码气味,因为它设置了循环依赖。

+0

+1好点。只需使用view/viewcontroller层次结构即可。 – tidwall 2010-09-11 22:24:42

+0

对不起,这是一个错字它应该是ChildController分配。如何使用委托不同?比指针? Im新的Objective-C – Joey 2010-09-12 00:51:13

+0

代表团是Cocoa的基本设计模式之一。请参阅:http://developer.apple.com/library/ios/#documentation/general/conceptual/devpedia-cocoacore/Delegation.html和http://stackoverflow.com/questions/626898/how-do-i-create -delegates-in-objective-c – 2010-09-12 00:54:00

2

将其设为零(或什么都不做)。释放将是错误的,因为你的财产不保留(它只是分配)。

-1

为什么你需要反正父视图控制器的属性? UIViewController已经包含一个名为parentViewController的属性,因此您不需要定义另一个属性。

但是如果你必须这样做,你应该:

  1. 使用retain,而不是assign在你的财产申报。
  2. 使用[self.parent release]在你的孩子视图控制器的dealloc方法。
+0

-1,使用self.parent = nil。无论是保留还是分配,这都是有效的。该物业将做“正确的事情”。 – 2010-09-12 05:18:09