0

ストーリーボードに2つありますUIViewControllers( 付きNavigationController)。

ViewController1 でカメラにアクセスして写真を撮っています。ViewController2 に切り替えて、キャプチャした画像をUIImageView.

ViewController2 H ファイル

@interface ViewController2 : UIViewController

{

-IBOutlet UIImageView *matchImage;

}

-(IBAction)restart:(id)sender;

@property (retain, nonatomic) UIImageView *matchImage;

@end

ViewController1 M ファイル

写真を撮るコードの後、次の構文を使用してビューを切り替えようとします

ViewController2 *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];

[self.navigationController pushViewController:vc animated:YES];

[vc.matchImage setImage:tempImage];

初めて写真を撮ると、これは完全に正常に機能し、ViewController2 に画像が表示されます。

ただし、次の構文でViewController2に戻るボタンがあります

ViewController2 Mファイル

-(IBAction)restart:(id)sender

{

    ViewController1 *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController1"];

    [self.navigationController pushViewController:vc animated:YES];

}

これは正常に ViewController1 に戻り、もう一度写真を撮ってプロセスを繰り返すことができます。しかし、プロセスを約 3 ~ 4 回繰り返した後、Received Memory Warning が表示され、アプリがクラッシュします。Xcode でアナライザーを実行しても問題は発生しません。

次の行をコメントアウトすると

[vc.matchImage setImage:tempImage];

その後、無限のキャプチャ (問題なく 50 以上) を実行できますが、もちろん ViewController2 には画像が表示されません (空白です)。したがって、これにより、matchImage をリリースする必要があると考えるようになりました (特に、retain 属性を持つプロパティであるため)。しかし、これは役に立たなかったようです。どんな助けでも大歓迎です。私はまだメモリ管理について学んでいます。

アップデート

ビュー間の切り替えを 3 回繰り返した後、デバッガーの出力が表示されます。ViewController の viewDidUnload と didReceiveMemoryWarning の 2 つのメソッドに NSLog ステートメントを挿入しました。そのため、Received memory 警告が発生すると、2 つのビューコントローラーの 3 つの「インスタンス」がアンロードされているように見えます。そのため、ビューコントローラーを切り替えるたびに、新しいコピーを取得しているようです。これはあなたが期待するものですか?

2012-10-22 08:23:32.008 TestApp[787:707] メモリ警告を受け取りました。

2012-10-22 08:23:32.015 TestApp[787:707] viewDidUnload ViewController1: 0xfd52250

2012-10-22 08:23:32.017 TestApp[787:707] didReceiveMemoryWarning ViewController1: 0xfd52250

2012-10-22 08:23:32.023 TestApp[787:707] viewDidUnload ViewController2

2012-10-22 08:23:32.025 TestApp[787:707] didReceiveMemoryWarning ViewController2

2012-10-22 08:23:32.028 TestApp[787:707] viewDidUnload ViewController1: 0x16dc30

2012-10-22 08:23:32.030 TestApp[787:707] didReceiveMemoryWarning ViewController1: 0x16dc30

2012-10-22 08:23:32.033 TestApp[787:707] viewDidUnload ViewController2

2012-10-22 08:23:32.037 TestApp[787:707] didReceiveMemoryWarning ViewController2

2012-10-22 08:23:32.040 TestApp[787:707] viewDidUnload ViewController1: 0x171de0

2012-10-22 08:23:32.042 TestApp[787:707] didReceiveMemoryWarning ViewController1: 0x171de0

2012-10-22 08:23:32.044 TestApp[787:707] didReceiveMemoryWarning ViewController2

2012-10-22 08:23:32.046 TestApp[787:707] didReceiveMemoryWarning ViewController1: 0xfd87580

4

1 に答える 1

1

メソッドで行っていることはrestart、以前のコントローラーに戻るのではなく、最初のコントローラー タイプの別のコピーをナビゲーション スタックに追加することです。popViewControllerAnimated:代わりに、ナビゲーション コントローラーに指示してみてください。

于 2012-10-22T12:46:15.513 に答える