2

私の研究で、私は奇妙な何かに出くわしました。

@interface Class {
    NSString *_string
}

- (void) Method1 {
    _string = @"ASDF";
}

当初、私はそれ_stringが自動解放プールの一部であると思っていましたが、実際にはそのメモリの側面については考えていませんでした。

このSO投稿を読んだ後、Objective C NSString *プロパティはカウントの奇数を保持します いいえ、そうではなく、の保持カウント_stringは実際にはUINT_MAX

明らかに、自動解放プールの一部である私の考え_stringはまぐれであり、変数をどのように処理するかはどういうわけかうまくいきました。しかし、私が知りたいのは、いつ@"ASDF"捨てられるのかということです。プロパティとセッターを使用する必要があることはわかっていますが、変数に定数を割り当てるのは非常に直感的であるため、このように見えるコードはおそらくたくさんあります。

これらの不変のリテラルNSStringのライフサイクルは何ですか。また、メモリに存在しなくなった[_string length]ため、実際にエラーが返されるのはいつですか。@"ASDF"

4

2 に答える 2

4

Fromリテラル NSString は自動解放されますか、それとも解放する必要がありますか?

コンパイラによって割り当てられた文字列 (@"STRING" の形式) は定数であるため、それらに対する -retain、-release、および -autorelease メッセージは無視されます。この場合、foo を解放または自動解放する必要はありません (ただし、害はありません)。

あなたがするときのボンネットの下

NSString* yourString = @"ABC";

文字列は、データ セグメントと呼ばれるメモリ領域に格納されます。この領域は、アプリケーションの起動後に変更されることはありません。ここで、文字列はアプリの定数として扱われます。同時に文字列はオブジェクトなので、保持したい場合はretainorを呼び出しますcopy

あなたがするとき、逆に

NSString* yourString = // alloc-init

ヒープ上にオブジェクトを作成します。解放するのを忘れると、メモリ リークが発生します。他の誰かがそれを破壊し、あなたがそれにアクセスしようとすると、そのメモリの場所へのアクセスがうまくいきません。

それが役立つことを願っています。

于 2012-06-28T17:19:09.067 に答える
0

手動で作成された不変の文字列 (NSString) は、通常の参照カウント規則に従い、したがってライフ サイクルに従います。

あなたの例では、実際には文字列リテラルであるため、文字列はさらに特別です。リテラルの場合と同様に、それらは特別なメモリに常駐し、実行可能ファイルが終了したときにのみ破棄されます。

于 2012-06-28T17:17:41.590 に答える