2013-09-03 12 views
7

注:私の質問はthisとは関係ありません。Objective-cでの静的使用

NSString *const kMyConstant = @"Hello World"; 

またはこれを:

変数は、それがメモリ割り当ての観点に宣言されているファイルの外側に見られないほか、(メソッドの外側)この宣言の間に違いがあります。

static NSString *const kMyConstant = @"Hello World"; 

答えて

2

メモリの割り当てに関して、いいえ、違いはありません。両方の変数は同じ文字列定数へのポインタであり、どちらも一度だけ割り当てられ、どちらの場合もその存続時間はプログラムの存続期間です。

+0

どちらも@コンパイル時に割り当てられますが、非オブジェクト変数の違いはありますか? – Peres

+0

@JackyBoyどのような意味で? –

+0

intのfloatの構造 – Peres

1

いいえ、それは単にコンパイル単位外部オブジェクトの可視に効果がありません。

これも使用して達成することができる。コブラーズある

__attribute__ ((visibility ("hidden")) NSString *const kMyConstant = @"Hello World"; 

EDITと、 visibility hidden属性は、コンパイル単位ではなく、共有オブジェクトの外部での可視性に影響します。

+0

事実、「静的」なしでは、NSStringは(例えば、UIViewControllerの中で宣言されている場合)一度解放されてもVCは破棄されますか? – Peres

+0

@JackyBoyいいえ、それは定数文字列であるという事実は、 'retain'と' release'などはまったく効果がないということを意味します。それが通常の文字列だった場合、私はARCがオブジェクトの存続期間を追うことができるとは考えていないので、静的であるかどうかにかかわらず、どちらも割り当て解除されるとは思わないでしょう。間違っているかもしれませんが、開発者であれば、リリースするために 'nil 'を割り当てなければならないと思います。 – trojanfoe

+0

静的な場合は真ですが、プログラムが "生きている"限り長く滞在します。しかし、静的なことがなければ、それは本当ですか? (参照:http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.6.html) – Peres

0

固定小数点スコープの変数を宣言すると、パフォーマンス上の理由から、反復呼び出しよりも割り当てられた値が保持されることがありますが、それはメモリとして欠点があります静的変数は一度割り当てられ、アプリケーションが終了するまでプログラム内にとどまります。静的に定義された変数を解放することは非常に困難です。アプリケーションが終了するまでメモリを解放することは決してありません。メモリ全体を使用する危険があり、ARCはここであなたを助けません。

1

これは非常に興味深い質問です。なぜなら、一方では定数の明確で分かりやすい管理と、NSStringクラス定数を扱うときにObjective Cとclangに含まれるいくつかの明白な例外があるからです。

私は、次が適用されないと信じて:質問から

上記の宣言と初期化は、メモリ管理に違いはありません。それは本当に存在しません。定数は単にバンドルに含まれ、古典的な用語では割り当てられません。オブジェクトクラスからの値が、文字列定数があるバンドルメモリの場所を指していることを意味します。このようなNSStringのアドレスとそのオブジェクトクラスを比較すると、これを簡単に見つけることができます。文字列アドレスが非常に低く、バンドルの場所のアドレス範囲を指しています。コード内で初期化された他の文字列のアドレスは、非常に異なる場所を指していることがわかります。 Objective Cランタイムは、バンドルから何かを "解放"するか削除するのが非常に面倒なので、文字列定数のメモリ管理は一切行いません。したがって、ARC以外の環境でこれをプレイすると、保持と解放が単に無視されることがわかります。

質問に答えてこれを終了するには、いいえ、どちらの場合でもメモリを管理する違いはありません。それは単に行われていません。メモリはバンドルによって割り当てられ、アプリケーションが終了するとOSによって解放されます。宣言と実装の外側で明示的な定数を割り当てるだけでなく、どのメソッドの内部にも適用されます。

関連する問題