我的sub-viewControllers的弱或强属性?

时间:2012-05-07 19:47:22

标签: ios cocoa-touch properties uiviewcontroller delegates

#import <UIKit/UIKit.h>
#import "UCMapviewController.h"
#import "UCMenuviewController.h"
#import "UCOverviewController.h"

@interface UCRootViewController : UIViewController

@property (weak, nonatomic) UCMapviewController *mapviewController;
@property (weak, nonatomic) UCMenuviewController *menuviewController;
@property (weak, nonatomic) UCOverviewController *overviewController;

这是我的UCRootViewController的声明,它应该管理这些子viewControllers。他后来也将成为他们的代表,以便在何时应该显示一个控制器时进行处理。

rootViewController在UIAppDelegate中保持强大,并将一直保持活动状态。

让那些sub-viewControllers变弱是否正确?我不是100%肯定,但据我所知,当没有强指针指向它们时,弱指针会被释放。因为根很强大,让它们变弱是正确的,对吗?

#import <UIKit/UIKit.h>

@class UCRootViewController;
@interface UCOverviewController : UIViewController

@property (weak, nonatomic) UCRootViewController *rootviewController;

这是我的一个子viewControllers的标题。它们有一个指向(稍后)委托rootviewController的弱指针。是否足以声明@class UCRootviewController使它们调用委托方法?我甚至需要这个吗?

感谢

编辑:我刚看了a nice article about ViewControllers和段落:

  

始终使用高质量的视图控制器容器或   + [UIViewController presentModalViewController:animated:]在应用程序中显示视图控制器。如果你需要保持参考   到某个地方的视图控制器,使用弱引用,除非你   真的希望它能够保持更长时间的缓存目的。在这样的   确保正确回应低内存条件。

它说使用弱引用,你对此有何看法?

2 个答案:

答案 0 :(得分:9)

强指针只与rootViewController绑定。这并不意味着它会自动强大指向你的rootViewController中的其他viewControllers。

您应该将这些属性设置为strong,以确保您的其他viewControllers不会以您不希望的方式取消分配。

如果你将它们推入导航堆栈就可以了,因为导航堆栈会自动强化它们。但是如果你只是想在rootViewController中将他们的视图添加为子视图,那么你需要确保这些属性是强大的。

当没有强指针时,对象会被释放。由于没有强大的指针指向其他viewControllers,因此它们将被取消分配。

答案 1 :(得分:2)

Strong相当于retain,除了ARC将为您管理释放。 弱是为了避免保留周期 - 父母保留孩子,反之亦然。

__ weak指定不使引用对象保持活动状态的引用。当没有对象的强引用时,弱引用设置为nil。

这是一个链接:Weak and strong property setter attributes in Objective-C

鉴于您希望保留这些视图控制器,最佳选择是强大的参考!确保在您需要它们之前它们没有被释放!