我的子视图控制器应该使用弱引用还是强引用?

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声明,它应该管理这些子视图控制器。稍后它还将成为它们的委托,以处理何时显示或不显示一个控制器。
根视图控制器在UIAppDelegate中被强引用,并且将一直保持活动状态。
那么把这些子视图控制器设置为weak是否正确?我不是100%确定,但据我所知,当没有强指针指向它们时,弱指针会被释放。因此,由于根视图控制器是强引用的,把它们设置为weak是正确的,对吗?
#import <UIKit/UIKit.h>

@class UCRootViewController;
@interface UCOverviewController : UIViewController

@property (weak, nonatomic) UCRootViewController *rootviewController;

这是我的其中一个子视图控制器的标题。它们具有稍后委托根视图控制器的弱指针。声明 @class UCRootviewController 是否足以使它们调用委托方法?我是否需要这样做?
谢谢。
编辑:我刚刚阅读了一篇关于ViewControllers的好文章,其中有一段话:
始终使用高质量的视图控制器容器或 +[UIViewController presentModalViewController:animated:] 在应用程序中显示视图控制器。如果您需要在某处保留对视图控制器的引用,请使用弱引用,除非您确实希望它为缓存目的而保持活动状态。在这种情况下,请确保正确响应低内存条件。
它说使用弱引用,你对此有什么看法?

2
当您使用容器强烈依赖于您的ViewController时,请使用弱引用。正如我在我的答案中所写的那样,例如当您使用导航控制器时,使用弱引用是可以的。但是,当您想要保留控制器并将它们的视图作为子视图添加到当前VC的视图中时,则需要使用强指针,否则它们将被过早释放。 - Johannes Lumpe
2个回答

9
强指针仅与您的rootViewController相关联。这并不意味着它会自动强制指向根视图控制器中的其他viewControllers
您应该将这些属性设置为强引用,以确保您的其他viewControllers不会以您不想要的任何方式被释放。
如果将它们推入导航堆栈中,那么就不会有问题,因为导航堆栈会自动进行强引用。但是,如果您只是要将它们的视图作为rootViewController的子视图添加,则需要确保这些属性是强引用。
当没有强指针指向对象时,对象才会被释放。由于没有强指针指向您的其他viewControllers,它们将被释放。

我原以为这意味着只要没有强引用指向它们,那么根视图控制器就不会被释放。因为根视图控制器被应用程序代理强引用,所以它不会被销毁,只要它指向其他对象就没问题。但是我显然误解了这个意思。 - MJB

2

Strong相当于retain,但是ARC会为您管理释放。

Weak用于避免保留循环 - 即父对象保留子对象,反之亦然。

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

这里有一个链接:Objective-C中的弱引用和强引用属性设置器

考虑到您想要保留这些视图控制器,最好的选择是使用强引用!确保在需要它们之前不要将它们释放!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接