2012-02-13 11 views
10

の違いは何:NSStringの割り当てと初期化

NSString *string1 = @"This is string 1."; 

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.]; 

は、なぜ私が割り当てて、最初の文字列を初期化し、まだそれはまだ動作しないのですか?私はそれがオブジェクトであるので、私はNSStringを割り当てることになっていたと思った?ココアタッチで

-(IBAction) clicked: (id)sender{ 
    NSString *titleOfButton = [sender titleForState:UIControlStateNormal]; 
    NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton]; 
    labelsText.text=newLabelText; 
    [newLabelText release]; 
} 

なぜtitleOfButton文字列を割り当て、初期化しませんか?私の方法は私のためにそれを行うのですか?

また、私はXCode 4を使用していますが、iOS 5などは嫌いですので、ARCは使用しません。私はすべきことを言ってはいけません、なぜこれがそうであるかを知るために私はここにいます。ありがとう!

+0

[Do NSStringオブジェクトを割り当てる必要がありますと、init?](http://stackoverflow.com/questions/637022/do-nsstring-objects-need-to-be-alloc-and-init) – Caleb

答えて

13

変数string1は、NSStringstring literalです。コンパイラは、実行可能ファイルにそのための領域を割り当てます。これはメモリにロードされ、プログラムの実行時に初期化されます。アプリが動く限り生きています。 retainまたはreleaseにする必要はありません。

変数string2の有効期間は、releaseの最後の参照までの期間までです。あなたはそれのための領域を割り当てるので、後でそれを掃除する責任があります。

変数titleOfButtonの有効期間は、方法-clicked:の有効期間です。これは、メソッド-titleForState:autorelease -d NSStringを返すためです。その文字列は、メソッドのスコープを離れると自動的に解放されます。

newLabelTextを作成する必要はありません。そのステップは冗長で面倒です。

labelsText.text = titleOfButton; 

なぜプロパティを使用します。単にtitleOfButtonからlabelsText.textプロパティを設定しますか?このretainプロパティを設定すると、titleOfButtonという参照カウントが1つ増えます(そのため、retainプロパティと呼ばれます)。titleOfButtonが指し示す文字列は、-clicked:の末尾に位置します。

この例でretainの使用について考えるもう1つの方法は、labelsText.texttitleOfButtonが指す文字列の「所有権を取得する」ことです。その文字列は、labelsTextの生存期間(他の変数も文字列の所有権を持たない限り)になります。

+0

この点を拡張するだけで、Objective Cの '@'スタイルの文字列リテラルに対する 'retain'と' release'の呼び出しは明示的に無視されます。あなたは一日中それを「解放」することができ、それは解放されません。 – StilesCrisis

+0

基本的に、私はそのコードにあるすべてが正しいです、そして、私は単にnewLabelText文字列を削除することができますか?そして、ユーザーラベルは、タイトルを設定するためにsetterを合成しましたか?私はまだまだ新しいものですが、あなたが「このプロパティを保持する」と言うと、私はそれを保持すべきだと言っていますか? –

+0

'labelsText.text'プロパティはあなたが設定した文字列を保持します。ですから、あなたはそれを行うためにプロパティ値の割り当てを使用しているので、 'retain'を使う必要はありません。 Objective-Cプロパティの詳細については、このチュートリアルを参照してください。http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial –

関連する問題