9
#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 的声明,它应该管理这些子视图控制器。他稍后还将成为他们的代表来处理何时应该显示或不显示一个控制器。

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

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

#import <UIKit/UIKit.h>

@class UCRootViewController;
@interface UCOverviewController : UIViewController

@property (weak, nonatomic) UCRootViewController *rootviewController;

这是我的一个子视图控制器的标题。他们有一个指向(后来的)委托 rootviewController 的弱指针。@class UCRootviewController声明让他们调用委托方法就足够了吗?我什至需要这个吗?

谢谢

编辑:我刚刚阅读了一篇关于 ViewControllers和段落的好文章:

始终使用高质量的视图控制器容器或 +[UIViewController presentModalViewController:animated:] 在应用程序中显示视图控制器。如果您需要在某处保留对视图控制器的引用,请使用弱引用,除非您真的希望它为缓存目的而保持更长时间。在这种情况下,请务必正确响应内存不足的情况。

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

4

2 回答 2

9

强指针仅与您的 rootViewController 相关联。这并不意味着它会自动指向您的 rootViewController 中的其他 viewController。

您应该将这些属性设置为 strong,以确保您的其他 viewController 不会以您不希望它们的任何方式被释放。

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

当没有指向它们的强指针时,对象会被释放。由于没有指向您的其他视图控制器的强指针,它们将被释放。

于 2012-05-07T19:53:06.340 回答
2

Strong 相当于保留,只是 ARC 会为您管理发布。弱是为了避免保留周期 - 父母保留孩子,反之亦然。

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

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

鉴于您想保留这些视图控制器,最好的选择是强参考!确保在您需要它们之前不会释放它们!

于 2012-05-07T19:55:05.153 回答