1

2 つの方法のうち、どちらが優れている/効率的ですか? より具体的には、どちらを使用する必要がありますか、またはどちらかを使用する適切な時期はありますか?

UIImage *img = [UIImage imageWithContentsOfFile:filePath];

また

UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];

ありがとう!

編集:私はARCを使用していることに言及すべきでした。

4

3 に答える 3

7

autorelease最初はd オブジェクトを返します。バージョンが標準のコンストラクターを呼び出す可能性が高いimageWithContentsOfFile:ため、速度/効率に目立った違いはないはずです。どちらも ARC 環境で同じように機能し、同じように使用されます。

于 2013-06-26T13:49:34.920 に答える
2

大きな違いは、objective-c参照カウントにあります。あなたinitがオブジェクトを所有しているとき、あなたはそれに対する所有権を主張しています。これは、オブジェクトが不要になったとき、つまり を呼び出すことによって、オブジェクトを解放する責任があることを意味します[img release]

init名前がor以外で始まるメソッドへの参照を取得するとcopy(他のプレフィックスがあるかどうかはわかりません)、これらのオブジェクトは に登録さNSAutoreleasePoolれ、プールがドレインされると自動的に解放されます。

これは次のように確認できます。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

UIImage *img1 = [UIImage imageWithContentsOfFile:filePath];
UIImage *img2 = [[UIImage alloc] initWithContentsOfFile:filePath];

[pool drain];

NSLog(@"%@", [img1 retainCount]); // 1
NSLog(@"%@", [img2 retainCount]); // 0 or invalid mem access, not sure

オブジェクトのアクセサーを作成し、その結果、呼び出し元ではなくアクセサー メソッドに所有権を委譲する場合に必要な自動解放動作を実装するには、次のようにします。

[obj autorelease];

ファイル内のメソッドNSAutoreleasePoolによって 1 つのプールが既にセットアップされているため、その動作についてはあまり心配する必要はありません。NSApplicationMainmain.c

このメカニズムについては、NSObject Protocol ReferenceおよびAdvanced Memory Managementで詳しく調べることができます。

于 2013-06-26T14:00:11.497 に答える
1

最初は alloc ですべての画像を宣言していたので、特定の関数の最後に alloc で作成された画像を返した場合、メモリリークの問題のため、その画像を自動解放する必要がありました。最初の宣言を使用すると、何も解放する必要はありません

オブジェクトを「販売」する場合、それは正確です。しかし、それ以外の場合、iOS でオブジェクトを作成するときに、既製の自動解放オブジェクトを取得するか、alloc に続いて release を呼び出すかを選択できる場合、Apple は alloc と release を使用することを望んでいます。短く、あなたの管理下にあります。

ここでの問題は、自動解放されたオブジェクトが自動解放プールに存在し、いつでもプールが空になるまで積み重なる可能性があることです。

もう 1 つ気をつけなければならないのは、ループです。気付かないうちに自動解放されたオブジェクトを生成する可能性があり、それらはプールに積み上げられます。解決策は、ループの開始時に独自の自動解放プールを作成し、ループの終了時にそれを解放して、オブジェクトがループを通過するたびに解放されるようにすることです。

編集 - 2011 年 12 月 18 日: しかし、iOS 5 と ARC の登場により、自動解放メカニズムははるかに効率的になり、解放のようなものはありません。ムダになる。(また、自動解放プール (疑似) オブジェクトではなく @autoreleasepool ブロッ​​クになりました。)

この質問から得ました。

于 2013-06-26T13:57:18.700 に答える