私は今までどおりメモリフットプリントを除いて正常に動作すると思われるアプリケーションObjective-C
を書いています。私はXcode 4.6.2の最後のバージョンでARCを使用しています。私のシステムは10.7.5です。ARCは[NSDate date]を使用してもメモリを解放しませんが、[[NSDate alloc] init]を使用して正常に動作します。
私は非常にObjective-C
に新しく、何が私の記憶で起こっているのかを理解する助けが必要です。私は次の基本的なコードがなぜ動作するのかを説明する問題を絞りました。
このコードは、Xcodeが提供するバニラのCocoaベースのアプリケーションテンプレート(ARCが有効)に追加されています。
ケース
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
NSDate* d;
for(int i=0; i<1000000; i++){
d = [[NSDate alloc] init];
}
}
すべてが期待どおりになると、ARCはその場でメモリを再利用。すなわち、メモリ使用履歴は非常に平坦です。 forループが終了すると、アプリは約25MBのメモリを消費します。
ケースB
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
NSDate* d;
for(int i=0; i<1000000; i++){
d = [NSDate date];
}
}
ここでは、物事は私にはとても神秘的です。アプリを実行するだけで、(実際の)メモリ使用量は約53MBまで増加し続け、永遠にそこにとどまります。
しかし、allocationsプロファイラツールを実行すると、forループの最後に、すべてのオブジェクトの割り当てが解除されることがわかります。これは、オートリリースプールの場合と非常によく似ています。また、forループの本体を@autoreleasepool {}で囲むと、ケースBはケースAのように振る舞います(期待通り)。
ので、3つの質問:
- の下ARC、 "自動解放"
[NSDate date]
とのalloc初期化オブジェクトを使用しての違いは何ですか? (私はここに他の質問に近いものはないと思っていました) - コードを実行するときにARCが起動しないのはなぜですか?
- なぜプロファイルアプリケーションと実際のアプリケーションのメモリ動作に違いがありますか?
A:ARCは手動で作成されていることを知っており、 'for'が終了すると解放する必要があります。 B:イベントループ終了時に「autorelease」に入っています。 –
これも私の理解ですが、 "イベントループの終わり"は決して来ないようです!私がどれくらい待っているかにかかわらず、GUIをどのくらい使っているかに関係なく、メモリー使用量は効果的に高く保たれます。チェックする場合はローカルループを作成してチェックしたい場合は – akant
を入力してください。 –