0

私のビュー階層は、いくつかのカスタム「ルート」UIViewControllerサブクラスにあります。ルートVCサブクラスの1つにカスタムself.viewを設定しようとしています。そこで、私はやっています:

MyRootViewController_With_Scroll.h

// Import lowest level root VC
#import "MyRootViewController.h"
// my custom scroll view I want to use as self.view
@class MyScrollView;

@interface MyRootViewController_With_Scroll : MyRootViewController {

}

@property (strong) MyScrollView *view;

@end

MyRootViewController_With_Scroll.m

#import MyRootViewController_With_Scroll.h;

@interface MyRootViewController_With_Scroll ()

@end

@implementation MyRootViewController_With_Scroll

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)loadView
{
    NSLog(@"loading view");
    CGRect windowSize = [UIScreen mainScreen].applicationFrame;
    MyScrollView *rootScrollView = [MyScrollView scrollerWithSize:windowSize.size];
    self.view = rootScrollView;

}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// Getter and setter for self.view
- (MyScrollView *)view
{
    return (MyScrollView *)[super view];
}
- (void)setView:(MyScrollView *)view
{
    [super setView:view];
}

iOS6のドキュメントによると、viewDidLoadは、アプリのライフサイクル全体でViewControllerごとに1回だけ起動することを想定しています。

私はここで何が間違っているのですか?ビューコントローラがloadView/viewDidLoadを繰り返し呼び出す原因は何ですか?不思議なことに、私のアプリの「ホーム画面」VCはビューを1回だけロードしますが、ナビゲーション階層内の後続のすべてのビューは、表示されるたびにloadViewを起動します。何が起こっている?

編集プロパティをに変更しましたstrong。同じ問題が発生します。

編集2loadViewのオーバーライドを停止しましたが、まだ発生しています。今、私は本当に混乱しています。

4

2 に答える 2

2

これは予想される動作です。ビューコントローラをナビゲーションスタックからポップしていて、他にそれらへの参照がない場合、それらは割り当て解除されます。したがって、再び表示されると、新しいインスタンスになるため、繰り返し実行する必要がloadViewあります。ロギングに含めるselfと、毎回異なるオブジェクトであることがわかります。

また、View Controllerのviewプロパティを次のように再定義しました-ViewControllerオブジェクトを再利用している場合、ビューにスーパービューがなくなるとすぐにこれは無効になりますweak

iOS 6より前は、ナビゲーションスタックの途中にあったView Controllerは、メモリ不足でビューをアンロードしていました。

root --> VC1 --> VC2

VC2が画面に表示され、メモリ警告が受信されます。VC1はそのビューをアンロードします。VC2をスタックからポップすると、VC1がloadView再度呼び出します。これはもう起こりません。

ただし、VC1に戻ったときに、VC2を強く参照しているものがない場合、VC2の割り当ては解除されます。別のVC2をスタックにプッシュすると、これは新しいインスタンスであり、loadView再度呼び出されます。おそらく、コードでVC2のこれらの新しいインスタンスを作成しているので、新しいインスタンスを作成していることがわかるはずです。

于 2013-03-27T13:59:31.187 に答える
0

これは、ビュープロパティが弱いためです。したがって、常に再割り当てされます。また、viewプロパティをオーバーライドする必要はまったくないと思います。

于 2013-03-27T14:01:34.893 に答える