1

こんにちは私は基本的に2つの質問があります

1)iOS6 xcode 4.2 ARC環境で作業しているときに、アークがスコープの最後でのみ呼び出しを行うことがわかったので、メモリリークを処理する必要がありますか?

2)声明

self.profileImageView.image = [UIImage imageNamed:@"createProfile_addPhoto.png"];

画面にとって重いプロセスであるメモリに画像を配置します。多くの場所で読んだのですが、これに代わる代替コードが見つかりませんでした。もっと良い解決策はありますか。

単に私はメモリの問題を処理する必要があります。

4

4 に答える 4

4

imageWithContentsOfFileimageNamed使用する 代わりに:

 NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"createProfile_addPhoto" ofType:@"png"];

 self.profileImageView.image =  [UIImage imageWithContentsOfFile:imagePath];
于 2013-03-27T07:17:22.663 に答える
2

1)はい、特定の場合(つまり、強力な参照サイクル)

2)[UIImage imageWithContentsOfFile:]あなたの代わりになることができます。 imageNamed:キャッシングシステムを実装します。ただし、メモリが不足すると、それ自体がパージされます。

于 2013-03-27T07:15:45.343 に答える
2

あなたの質問をよく理解したかどうかはわかりませんが、
1-ARCはObjective-Cオブジェクトのすべてのメモリを管理し、iOS6ではGCDキューも管理します
2-使用しているメソッドは、さらなる呼び出しのために画像をメモリにキャッシュします。したがって、この画像を何度も呼び出す場合は、それだけの価値があります(画像が本当に大きい場合を除く)。

より小さなスコープを作成する必要がある場合は、コードを@autoreleaseブロックに埋め込むことができます。これは、サイクルを処理するときに役立ちますが-imageNamed:、前述のように使用すると、画像がキャッシュされます。より良い使用-imageWithContentsOfFile:
ARCでのリークはほとんど不可能です。これは、ARCによって自動的に管理されないCoreFoundationの不透明(OPAQUE)型を扱っている場合に発生します。ARCを使用して発生する可能性があるのは、メモリの放棄またはサイクルの保持であり、ARCを使用したリークについては聞いたことがありません。
これがお役に立てば幸い、アンドレア

于 2013-03-27T08:00:50.343 に答える
2

質問1):
ARCでメモリリークが発生するもう1つの可能性は、自動解放プールを設定せずに別のスレッドを使用することです。Appleドキュメントhttps://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html
"スレッドの実行が開始されたらすぐに、独自の自動リリースプールブロックを作成する必要があります。それ以外の場合は、アプリケーションはオブジェクトをリークします。」
自動解放プールが設定されていない場合、単純なgetterメソッドを呼び出しても、自動解放オブジェクトが返されると、メモリリークが発生します。

于 2013-03-27T08:03:00.093 に答える