下面关于Objective-C内存管理的描述错误的是
A 当使用ARC来管理内存时,代码中不可以出现autorelease
B autoreleasepool 在 drain 的时候会释放在其中分配的对象
C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露
D 在使用ARC的项目中不能使用NSZone
= =。。
网上看到的,参考答案为A.
我觉得选C来的~
不知道A错在哪里了?
巴扎黑2017-04-18 09:51:28
A の間違いは、ARC を使用する場合、コンパイラは autorelease の使用を禁止し、コンパイラは、retain および release と同様に、autorelease の追加を支援することです。ただし、__autoreleasing を使用して変数を指定し、それを autoreleasepool
に追加することができます。PHPz2017-04-18 09:51:28
C の説明は正しいです。autoreleasepool を使用すると、多数のオブジェクトを作成する必要がある場合にオブジェクトの解放を高速化できます。
A が間違っている場合、それは問題作成者があなたをテストしたいと考えていることを意味するだけです。実際、ARC の原理は、コンパイラが自動的に autorelease およびその他のコードをコードに追加することです。実際、ARC プロジェクトで autorelease を記述すると、コンパイルすることさえできません。このように考えると、実際には A が正しいのです。
しかし、他の 3 つは正しいので、A しか選択できません。
==========更新==========
私の回答が気に入らない人は、私の回答のコメント欄で何が問題なのか教えていただければ幸いです。
Aが間違っている理由を大まかに推測しただけですが、私は投稿者Cが正しいと明確に答えました。
C が正しい理由については、公式ドキュメント autoreleasepool を参照してください。
セカンダリ スレッドを生成する場合。
スレッドの実行が開始されたらすぐに独自の自動解放プール ブロックを作成する必要があります。そうしないと、アプリケーションでオブジェクトがリークします (詳細については、「自動解放プール ブロックとスレッド」を参照してください)。 )
==========再度更新==========
上記の文書は、多数のオブジェクトを作成するために自動解放プールが必要かどうかについて説明しています。 ARC のスレッド内:
http://stackoverflow.com/ques...
黄舟2017-04-18 09:51:28
A と D は基本的に同じですが、実際には NSZone *zone = NSDefaultMallocZone();
このコードはコンパイルして実行できます。
あなたが読んだ参考回答は間違っています。
ARC では、プログラミングに自動解放を使用することはできませんが、@autoreleasepool
は使用できます。その機能はメモリ使用量を削減することです。
以下の内容は主に @ChickenBoy の「Cocoa アプリケーションの各スレッドは、自動解放プール ブロックの独自のスタックを維持します。他のスレッドでは、自動解放プールを自分で作成する必要があります。そうしないと自動解放プールは作成されません」自動的に解放され、メモリリークが発生します。」
Cocoa アプリケーションの各スレッドは、自動解放プール ブロックの独自のスタックを維持します。
この文では、「Cocoa アプリケーションの各スレッドは、自動解放プール ブロックの独自のスタックを維持します」という事実が 1 つだけ述べられています。
Foundation 専用のプログラムを作成している場合、またはスレッドを切り離す場合は、独自の自動解放プール ブロックを作成する必要があります。
Foundation 専用のアプリケーションを作成している場合、またはスレッドを切り離す場合は、独自の自動解放プール ブロックを作成する必要があります. プールブロックを解放します。
アプリケーションまたはスレッドが長期間存続し、大量の自動解放オブジェクトを生成する可能性がある場合は、自動解放プール ブロックを使用する必要があります (AppKit や UIKit がメイン スレッドで行うのと同様)。そうしないと、自動解放オブジェクトが蓄積され、メモリ フットプリントが増加します。切り離されたスレッドが Cocoa 呼び出しを行わない場合は、自動解放プール ブロックを使用する必要はありません。
アプリケーションまたはスレッドが長期間存続し、多数の自動解放オブジェクトが生成される可能性がある場合は、プールを自動的に解放する必要があります。ブロックしないと、自動解放されたオブジェクトが蓄積され、メモリを占有します。
作成したスレッドが Cacoa を呼び出さない場合は、自動解放プール ブロックを使用する必要はありません。
阿神2017-04-18 09:51:28
新しいスレッドを自分で作成する場合は、そのスレッド内のメモリを管理する必要があります。メイン スレッドの実行ループ内でのみ、autoreleasePush() と autoreleasePop() が自動的に追加されます。
巴扎黑2017-04-18 09:51:28
ARC はコンパイラ機能であり、iOS ランタイム機能や他の言語のガベージ コレクターではないからです。
これは、コンパイル時に決定されるメモリ管理のみを処理でき、使用されるメカニズムは参照カウントであることを意味します。
つまり、メモリの解放は必須ではありません。たとえば、相互メモリ参照や動的参照などによって参照カウントがすぐに 0 に設定されないため、この時点では明示的な解放が必要です。