0

まず、このサイトは素晴らしいと言いたいです! そして、iPhone アプリの作成中に多くのことを行うのに役立ちました。

今、私の問題は次のとおりです。

アプリを起動すると、if/else ステートメントに応じて画像を読み込む UIImageView があります。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

方法。これらのイメージは次のように割り当てられます。

BG.image = someImage;

もちろん、BG は UIImageView であり、someImage は @property、@synthesis を持つ iVar です。someImage は、viewDidLoad のメイン バンドルからの画像で初期化されます。

- (void)viewDidLoad {

//init stuff from file
someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"];

[super viewDidLoad];}

私のアプリは問題なく動作し、(前述のように) touchBegan に従って画像を読み込みますが、!

アプリがバックグラウンドに送信されて戻ってくると、最初のタッチでクラッシュします。

私が交換したとき:

BG.image = someImage

と:

BG.image = [UIImage imageNamed:@"FirstViewBG_5N.png"];

楽しく走る!? someImage がフラッシュまたは破損していると思いますか?

imageNamed メソッドは毎回ディスクから読み取るため、このままにしたくないので、パフォーマンスの問題が発生すると思いますか?

私の質問は明確だと思いますか?それは次のとおりです。

1- バックグラウンドから戻った後にアプリがクラッシュするのはなぜですか? 2- どうすれば解決できますか?

あなたのすべての助けに感謝します! ありがとう!

4

2 に答える 2

2

クラッシュは EXC_BAD_ACCESS だと思います(ただし、その情報を投稿していないため推測しています)。

「someImage」がインスタンス変数の場合は、それを合成してそのアクセサー (self.someImage) を使用して、保持またはコピーする必要があります。現状では、 someImage に何かを割り当てていますが、後でアクセスしようとすると、それはなくなっています。

于 2010-09-23T16:58:23.743 に答える
0

これを行う場合:

- (void)viewDidLoad {

    //init stuff from file
    someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"];

    [super viewDidLoad];
}

メソッドは、返さimageNamedれた後にガベージ コレクターによってクリーンアップされる自動解放されたオブジェクトをviewDidLoad返しています。それを保持してみてください:

    someImage = [[UIImage imageNamed:@"FirstViewBG_5N.png"] retain];

または、それを自動的に保持する合成セッターを使用します。

    [self setSomeImage:[UIImage imageNamed:@"FirstViewBG_5N.png"]];

またはUIImageのinitWithDataイニシャライザを使用:

    someImage = [[UIImage alloc] initWithContentsOfFile:@"FirstViewBG_5N.png"];

すべて機能的に同等です。#2または#3が最適です。

Apple の「メモリ管理ルール」ガイドがあなたの命を救います: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/ 20000994-BAJHFBGH

于 2010-09-23T17:08:01.307 に答える