0

私はUINavigationControllerを持っています。ユーザーがページを循環するにつれて、3つのビューがプッシュされます(常に同じ順序です)。私はviews0、1、および2と呼んで、ナビゲーションコントローラのインデックスと整列させます。ビューはストーリーボードで作成されます。popToRootViewControllerAnimatedの動作を確認するにはどうすればよいですか?

ビューの進行が終了し、ユーザーが最初に戻る場合は、ボタンプッシュに対応してpopToRootViewControllerAnimated:YESを使用し、UIはview0に適切に戻ります。しかし、私は時々、ビュー全体が完全にdeallocされていないことを明確にするために、サイクルをもう一度やり直すと、アプリケーション全体の通知に応答して「ファントム」ログステートメントを取得することがあります。私はxcode 4.2.1でiOS5 +コードのみでARCを使用していますので、ARCはかなりうまく処理しています。

私はARCが参照カウントが0になっていないビューをデアロック解除しないことを示唆しているいくつかの投稿を見たので、完了したらプロパティをnilに設定できます。最終的なビューにプッシュするときに何も残っていないことを示しています... NavigationControllerの外部にはview1(私が知っている)を参照するものはありません。ゾンビやメモリリークのためのアプリのプロファイリングは何も結果をもたらさない。

ビューを参照/ログ/デバッグする方法はありますか。 deallocを防ぐことができるものを入れずにdealloc'edされていることをどうすればわかるでしょうか?

view0はストーリーボードで「プッシュ」セグエを使用してVIEW1するプッシュ:

私のコードは、(基本的に)、以下のようです。

ビュー1:

- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 

    /* register as observer for some notifications */ 
    /* set properties and format an image or two */ 
    } 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

/* start some animation here */ 
} 


- (void) receiveNotification { 

NSObject *newObject = [[NSObject alloc] init]; 

[newObject doStuff]; 

/* Remove notification observers */ 

} 


- (void)objectDelegateMethod:(NSDictionary *) dataReturned { 

/* do stuff with dataReturned */ 
self.propertyName = dataReturned; 

[self performSegueWithIdentifier:@"AllDone" sender:self]; 

} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

if ([[segue identifier] isEqualToString:@"AllDone"]) 
{ 

View2ViewController *destinationView = [segue destinationViewController]; 

destinationView.propertyMagic = self.propertyName; 

[self setPropertyName:nil]; 
//do same with all other properties 

} 

VIEW2:私は通知のオブザーバとしてVIEW1を削除しない場合は、上記(ラフ)の構造を考えると

- (void)viewDidLoad 
{ 

/* display things based on self.propertyMagic */ 

} 


- (IBAction)userStartsOverButton:(id)sender { 

[self.navigationController popToRootViewControllerAnimated:YES]; 

} 

は、それが応答して出力し続け私はなぜそれがdealloc'edされていないか見ることができませんが、ログに。オブザーバーを削除しても、アプリの実行を繰り返していくうちにメモリ使用量が増加し、最終的には物事がクラッシュする(機器で漏れが検出されない)。

これをどのように把握しますか?

答えて

1

あなたがリークやゾンビを実行したことがあるなら、おそらくリークやオーバーリリースはありません。私はまだそれを参照したものを知っていれば

 
- (void)dealloc 
{ 
    NSLog(@"%s:%d", __func__, __LINE__); 
} 
+0

これは、Obj-Cの非ARC環境でプログラムされたことのない人には本当に有益な提案でした。私がpopToRootViewControllerAnimatedを実行する前にview1からすべてのサブビューを削除すると、ARCはそのビューをデアロクします。しかし、奇妙な部分は、deallocがしばしば数分遅れることです...それはARCで期待されていますか? Javaでは、ガベージコレクションの頻度などを調整できることはわかっていますが、私はARCがそれより少しクリーナーであると考えました。 – Amos

+0

また、アプリ内の他の場所からview1への自己記述リファレンスがないことにも気づくはずです。これは、ボイラープレートのストーリーボードセグによってインスタンス化され、手は同様のカスタムセグを介してview2に表示されます。 – Amos

+0

...と私はちょうど私のガベージコレクションのコメントがこれを読んだ後に間違っていた方法を理解した:http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1 私はまだ何かが短い時間の間、view1を保持してください。そうでなければ、すぐに解放されますか?ストーリーボードがそれを参照している可能性はありますか? – Amos

0

他のオブジェクトにview1へのポインタ(strong)があるかどうかを確認できます。その場合は、(weak)に変更するか、参照を保持しないでください。 (view0とview1の間、view1とview2の間に可能な保持サイクルがあるかどうか、おそらく彼らは互いの参照を保持している)。

ARCは他のオブジェクトが所有していないオブジェクトを解放します。だから、あなたもview0上-popToRootViewControllerAnimated:方法に上書きしようとするようなものを呼び出すことができます。

self.view1 = nil; 

view0がVIEW1への参照を維持する唯一のオブジェクトである場合、VIEW1は(dealloced)解放されなければなりません。

+0

ふむ、私はそれをnillingで遊んされます:あなたは、あなたのクラスに空のログdeallocを追加することができ、にdeallocはARCの下で起こる「見る」こと

弱いものと強いもののようなものを試してみる) – Amos

関連する問題