2011-01-26 1 views
1

現在、私はObjective-Cの小さな理解の問題で困っています。違いは、allocとinitを使ってNSStringを宣言し、@ "myString"で代入することです。

:アーロン・ヒレガスの著書次の例のように、私はクラスの init方法(本を知っている人にとって、これはRaiseManの Personクラスで使用されている)、この例のように値で NSStringを割り当てることについて思ったんだけど
- (id)init 
{ 
    if(![super init]) 
    return nil; 
    myString = @"New entry"; 
    return self; 
} 

この文字列は私によって割り当てられていないので、通常、私はそれを解放することを嫌うべきではありません。

BUT!この文字列のセッターメソッドではどうなりますか?

- (void)setMyString:(NSString *)newString 
{ 
    if(myString != newString) { 
     [myString release]; 
     [newString retain]; 
     myString = newString; 
    } 
} 

なぜ[myString release]作品:メソッドは次のようになり、メモリ管理をすべき規則に従って?私はどこかで読んだことがある、= @"bla"割り当てられた文字列で解放することはできません。

正しい方法で= @"bla"で初期化していますか?または代わりにallocinitを使用する必要がありますか?任意の助け

感謝:)

答えて

3
NSString *constantString = @"constantString"; 

文字列は、プライベート(?)クラスNSConstantStringからとも言われており、それらはすべてあなたのプログラムの人生を通して生きています。オフコースのリリースと仕事の保持(彼らはあなたに例外やクラッシュを与えないという意味で)彼らは何もしません。

here

続きを読むまた、あなたはそれがその後、属性を@properties {@property(..., copy) NSString myString;ことしかし、彼は彼自身のセッターを定義しているので、あなたが私たちを見せていることは、典型的な@property(..., retain)

+0

残念ながら、保持とコピーの間違いを申し訳ありません、それは確かに私のコメントに保持する必要があります!だから、私が与えたinitメソッドのようないくつかのオブジェクトを作成すると、膨大な量の文字列ができなくなります。 (=メモリリーク?)編集:ああ、あなたのリンクでこれの答えを見つけました。ありがとう! –

0

は、ヘッダー・ファイルで宣言myStringですか?のような:@property(nonatomic, retain) NSString myString。その場合、myStringが保持されます。それ以外の場合は、それを解放する必要はありません。

+0

であろうと、あなたのコメントの一つに言いました、保持のように、助言だけです。 (明らかに、彼は属性が示唆するようにすべきです)しかし、私はそれが文字列の初期化に対する答えではないとは思わない。 – nacho4d

+0

プロパティとして定義されていません。しかし、@property(readwrite、copy)も古い値を最初に解放しようとしませんか? –

+0

@ nacho4dそれは本当です – Mikael

3

AFAIK、@ "..."という形式の文字列定数は、実際にはno-opsとしてretainとreleaseを再定義するNSStringの子クラスです。これにより、コンパイラは、これらの文字列定数をヒープ上ではなく実行可能ファイルのデータセグメントに格納することができます。 constantStringよう

+0

ええと...ノーオップはどういう意味ですか? –

+1

彼らは何もしません(操作なし) –

関連する問題