注:私の質問はこれとは関係ありません。
変数が宣言されているファイルの外に変数が表示されないことに加えて、メモリ割り当てに関して、これを宣言すること(メソッドの外)との間に違いはありますか?
NSString *const kMyConstant = @"Hello World";
またはこれ:
static NSString *const kMyConstant = @"Hello World";
注:私の質問はこれとは関係ありません。
変数が宣言されているファイルの外に変数が表示されないことに加えて、メモリ割り当てに関して、これを宣言すること(メソッドの外)との間に違いはありますか?
NSString *const kMyConstant = @"Hello World";
またはこれ:
static NSString *const kMyConstant = @"Hello World";
これは非常に興味深い質問だと思います。なぜなら、定数の明確でわかりやすい管理と、Objective C と clang が NSString クラスの定数を処理するときに含まれるいくつかの明白な例外を示しているからです。
以下が当てはまると思います。
上記の宣言と質問からの初期化は、メモリ管理に違いはありません。それは単純に実際には存在しません。定数は単にバンドルに含まれており、従来の用語では割り当てられません。オブジェクトクラスからの値が、文字列定数があるバンドルメモリの場所を指していることを意味します。このような NSString とそのオブジェクト クラスのアドレスを比較すると、これを簡単に見つけることができます。文字列アドレスは非常に低く、バンドル ロケーション アドレス範囲を指しています。コードで初期化された他の文字列のアドレスが、非常に異なる場所を指していることがわかります。バンドルから何かを「解放」または削除するのは非常に面倒なので、Objective C ランタイムは文字列定数に対していかなる種類のメモリ管理も実行しません。なのでARC以外の環境でこれをいじってみると、
質問に答えてこれを終了するには、いいえ、どちらの場合もメモリの管理に違いはありません。それは単に行われていません。メモリはバンドルによって割り当てられ、アプリケーションの終了時に OS によって解放されます。宣言と実装外の明示的な定数の割り当てだけでなく、メソッド内でも適用されます。
上記の 2 つの式とは違いがあります。静的スコープで変数を宣言すると、割り当てられた値が繰り返し呼び出されても保持されます。これはパフォーマンス上の理由から良い場合もありますが、静的変数用のメモリが割り当てられるため、マイナス面があります。アプリケーションが終了するまで、プログラム全体を通してそこにとどまります。また、静的に定義された変数を解放することは非常に困難です。アプリケーションが終了するまでメモリを解放することはなく、大量のメモリを使用するリスクがあり、ARC はここでは役に立ちません。