2012-05-07 25 views
8
#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應該管理這些sub-viewControllers的聲明。他以後也會成爲他們的代表來處理一個控制器應該顯示與否。我的sub-viewControllers的弱或強屬性?

rootViewController在UIAppDelegate中保持強壯,並始終保持活動狀態。

所以這是正確的,使這些sub-viewController弱?我不是100%確定的,但據我瞭解,當沒有強指針指向它們時,弱指針會被釋放。所以,當根源很強時,讓它們變弱是正確的,對吧?

#import <UIKit/UIKit.h> 

@class UCRootViewController; 
@interface UCOverviewController : UIViewController 

@property (weak, nonatomic) UCRootViewController *rootviewController; 

這是我的一個sub-viewControllers的標題。他們有一個指向(稍後)委託rootviewController的弱指針。聲明@class UCRootviewController是否足以讓他們調用委託方法?我甚至需要這個嗎?

感謝

編輯:我剛讀a nice article about ViewControllers和通道:

始終使用高品質的視圖控制器容器或 + [UIViewController中presentModalViewController:動畫:]在應用程序中顯示的視圖控制器。如果您需要在某個地方將參考文獻 保留給視圖控制器,請使用弱引用,除非您爲了高速緩存目的而確實希望它保持更長的活動時間。在這種情況下,請務必正確響應低內存條件。

它說使用弱引用,你對此有何看法?

+2

它說使用弱引用時使用使用容器本身強烈您的Viewcontroller。正如我在我的回答中所寫的那樣,例如,當您使用導航控制器時,使用弱引用就可以。但是當你想保留控制器,因爲你只是將他們的視圖作爲子視圖添加到你當前的VC視圖中,那麼你需要使用強指針,否則它們將被過早地釋放。 –

+0

好的非常感謝你 – MJB

回答

9

強指針只和你的rootViewController綁定。這並不意味着它會自動指向您的rootViewController中的其他viewControllers。

您應該將這些屬性設置爲較強,以確保您的其他viewControllers不會以任何您不希望的方式被釋放。

如果您將它們推入導航堆棧中,它會很好,因爲導航堆棧會自動將它們指向它們。但是,如果你只是想在你的rootViewController中將他們的視圖添加爲子視圖,那麼你想確保這些屬性是強大的。

對象在沒有強指針時會被釋放。由於沒有強大的指向其他viewController的指針,它們將被釋放。

+0

我認爲這意味着只要沒有尖銳的對象指向他們。所以rootviewC是強大的我的appdelegate,它不會被釋放,只要他指向其他人就可以了。但我顯然誤解了這一點 – MJB

2

強是相當於保留,但ARC會管理你的釋放。 弱是爲了避免保留週期 - 父母保留孩子,反之亦然。

__weak指定一個引用,該引用不會使引用的對象保持活動狀態。當沒有強引用時,弱引用設置爲零。

這裏有一個鏈接:Weak and strong property setter attributes in Objective-C

既然你想保留圍繞這些視圖控制器,最好的選擇是一個很強的參考!確保它們在你需要它們之前不被釋放!