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 の宣言です。彼は後で、1 つのコントローラーを表示するかどうかを処理するデリゲートにもなります。

rootViewController は UIAppDelegate で強力に保持され、常にアクティブなままになります。

では、これらのサブビューコントローラーを弱くするのは正しいですか? 100%確かではありませんが、私が理解している限りでは、それらを指している強いポインターがない場合、弱いポインターの割り当てが解除されます。根が強いから弱くするのが正解でしょ?

#import <UIKit/UIKit.h>

@class UCRootViewController;
@interface UCOverviewController : UIViewController

@property (weak, nonatomic) UCRootViewController *rootviewController;

これは、私のサブビューコントローラーの 1 つのヘッダーです。それらには、(後の) デリゲート rootviewController への弱いポインターがあります。@class UCRootviewControllerデリゲート メソッドを呼び出すように宣言するだけで十分ですか? これも必要ですか?

ありがとう

編集: ViewControllersとその一節に関する素晴らしい記事を読みました:

アプリケーションでビュー コントローラーを表示するには、高品質のビュー コントローラー コンテナーまたは +[UIViewController presentModalViewController:animated:] を常に使用してください。ビュー コントローラーへの参照をどこかに保持する必要がある場合は、弱い参照を使用してください。このような場合は、メモリ不足の状態に正しく対応するようにしてください。

弱い参照を使用すると書かれていますが、これについてどう思いますか?

4

2 に答える 2

9

強力なポインターは、rootViewControllerにのみ関連付けられます。これは、rootViewController内の他のviewControllerを自動的に強く指すという意味ではありません。

これらのプロパティをstrongに設定して、他のviewControllerが不要な方法で割り当て解除されないようにする必要があります。

それらをナビゲーションスタックにプッシュすると、ナビゲーションスタックが自動的にそれらをポイントするので、問題ありません。ただし、rootViewControllerにサブビューとしてビューを追加するだけの場合は、それらのプロパティが強力であることを確認する必要があります。

オブジェクトへの強力なポインタがない場合、オブジェクトの割り当ては解除されます。また、他のviewControllerへの強力なポインタがないため、割り当てが解除されます。

于 2012-05-07T19:53:06.340 に答える
2

強力は、ARCがリリースを管理することを除いて、保持と同等です。Weakは、保持サイクルを回避するためのものです。つまり、親が子を保持し、その逆も同様です。

__weakは、参照されるオブジェクトを存続させない参照を指定します。オブジェクトへの強い参照がない場合、弱い参照はnilに設定されます。

リンクは次のとおりです。Objective-Cの弱くて強いプロパティセッター属性

これらのビューコントローラを維持したい場合、最良のオプションは強力なリファレンスです。必要になる前にリリースされていないことを確認してください。

于 2012-05-07T19:55:05.153 に答える