22

これは私を夢中にさせています!!!

sourceType = UIImagePickerControllerSourceTypeCamera.

これは、私が設定したviewDidLoadのコードです。

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Set card table green felt background
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];


    // Init UIImagePickerController
    // Instantiate a UIImagePickerController for use throughout app and set delegate
    self.playerImagePicker = [[UIImagePickerController alloc] init];
    self.playerImagePicker.delegate = self;
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}

そして、これが私がそれをモーダルに提示する方法です..

- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];

}

結果... UIImagePickerが表示され始め、ブームが発生します...メモリ警告が表示されます...毎回!興味深いことに、sourceType = UIImagePickerControllerSourceTypePhotoLibrary に切り替えると、すべて正常に動作します。

一体何が欠けているのか、間違っているのでしょうか? 私がやりたいことは、カメラを見せて、写真を撮って保存することだけです。

参考までに - 私は 3GS デバイスでテストしています。

助けてくれる人に感謝します:)

4

7 に答える 7

17

これは非常に一般的です。クラッシュすることなくメモリ警告を処理し、続行するのに十分なスペースがある限り、それがあなたを夢中にさせないでください。

于 2010-06-23T05:37:51.963 に答える
6

これは、アプリが使用したメモリ量に関するものではありません。ボタンが 1 つしかない非常に単純なアプリを作成し、ボタンをクリックしてからカメラを開く場合でも発生する可能性があるためです。iPhone 3GS、iPad 2、iPod touch 3G でテストしました。iPhone 3GS でのみ発生しました。アプリを実行する前にデバイスを再起動すると、もう起こらないことがわかりました。

もう 1 つの実際の解決策は[super didReceiveMemoryWarning]、viewController でコード をコメント化することです。

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

iOS 4.3.2 を搭載した iPhone 3GS で多くのテストを行った後、ロジックが次のようになる可能性があることがわかりました。 > ApplicationDelegate のメソッドapplicationDidReceiveMemoryWarning:(UIApplication *)applicationが呼び出されます -> 次に ViewController のメソッドdidReceiveMemoryWarning:が呼び出されます -> 次に viewDidUnload -> 次に viewDidLoad

次に、いくつかのビューが解放され、現在のビューが予期しないビューを指していることがわかります。

デフォルトで[super didReceiveMemoryWarning]は、ViewController のdidReceiveMemoryWarningメソッドが呼び出されたときに実行されます。コメントすると、viewDidUnload:andviewDidLoad:メソッドは呼び出されません。これは、mem 警告が完全に無視されたことを意味します。それが私たちが期待していたことです。

于 2011-07-29T09:45:16.303 に答える
5

4.0にアップグレードした後、それは私のアプリにも起こります-以前は3.1では警告はありませんでした。

実際、前にも言ったように、問題はないはずです。ただし、これにより、その後に続くビューが再度ロードされ、viewDidLoadが呼び出されます。これは私のアプリを台無しにします。なぜなら、viewDidLoadでビューを初期化するので、そうすべきではないのに、今度はもう一度初期化されます。

コメントと同じように、これは、ビューの読み込みを1回だけ行う他の多くのアプリでも発生する可能性があります。

于 2010-07-18T19:34:49.753 に答える
4

iOS 4.0 でも私のアプリの Did I Do That で発生しました。一貫性はありませんでしたが、最も一般的な原因は、UIImagePickerControllerインスタンスを作成し、アルバムの 1 つに保存されている大きな写真に移動したことです。
メソッドで状態を永続化didReceiveMemoryWarningし、viewDidLoad メソッドで状態からロードすることで修正されました。1 つの注意点は、アプリケーションの適切なポイントで状態保持ファイルをクリアすることを忘れないことです。私にとっては、通常の状況では関連する UIViewController を離れていました。

于 2010-07-23T17:58:47.310 に答える
1

私は数日間同じ問題に苦しんでいます。ただし、iPhone 4 をリセット (メモリをクリア) すると問題が解決するので、実際にはアプリの問題ではありません。

レベル 1 または 2 のメモリ警告がトリガーされ、UIimgPickerController デリゲート自体がオフロードされるようです。デリゲートのデリゲートを使用して私のアプリでも同じことが起こります(はい、できます)。ただし、メモリ警告の後、デリゲート (およびそのデリゲート) が再度読み込まれ、そこにあるコードが viewDidLoad によって実行されます。

すべてをテストするには非常に時間がかかるため、これが UIimgPickerController の使用中にのみ発生するかどうかはわかりません。

UIimgPickerController の表示中に viewDidLoad と viewWillAppear のコードが実行されないようにする追加のコードを書くことはできますが、それは上品ではありません。

ここで考えてみてください。アプリをテストしているため、メモリが不足している可能性があります。一部のメモリリークでは、デバッグするたびにこの問題に取り組んでいる可能性が非常に高くなります。

于 2010-12-28T12:23:41.300 に答える
1

UIImagePickerController を開くときにもメモリ警告が表示されます。私も4.01です。しかし、さらに、UIImagePickerController はシャッターを閉じるアニメーションを実行し、画面上のシャッターを閉じた状態で停止します。

メモリ警告に対する UIImagePickerController の動作は、それ自体を閉じることのようです。didReceiveMemoryWarning メソッドで親の ViewController から UIImagePickerController を削除することもできますが、これはひどいユーザー エクスペリエンスになります。

誰もこの問題を見たことがありますか?UIImagePickerController がシャットダウンしないようにメモリ警告を処理する方法はありますか?

于 2010-09-28T19:15:03.873 に答える