2011-12-03 10 views
5

は、私が現在読んでいる本は、私は次のコードを記述していますにNSArrayとNSStringの

-(IBAction)displaySomeText:(id)sender { 
    NSString *cow = @"Milk"; 
    NSString *chicken = @"Egg"; 
    NSString *goat = @"Butter"; 

    NSArray *food = [NSArray arrayWithObjects:cow, chicken, goat, nil]; 

    NSString *string = @"The shopping list is: "; 
    string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

    [textView insertText:string]; 

}

を、私は、配列がどのように動作するか多少理解が、私は次のコードに

string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 
を理解する助けが必要

私は、これが可能な場合を見たことがありません。

彼は私がNSStringクラスから、「文字列」オブジェクトを作成しており、その後、私は混乱している。この

string = [string stringByAppendingString:]; 

をやっています。私はオブジェクトを作成し、同じオブジェクトに対してメソッドを実行し、そのオブジェクトとまったく同じオブジェクトに格納する例を見たことがありません。

例えば、私は私が作成したオブジェクトを使用し、その上にクラスメソッドを実行した。..

が、私は常に同等と仮定しているため、この

NSSound *chirp; 
chirp = [NSSound soundNamed:@"birdChirp.mp3"]; 

上記は理にかなって行うことができます知っています次のコードは不可能でした

chirp = [chirp methodNameEtc..]; 

私は私の質問をよく説明しました。そうでなければ、私はいつももっと詳しく説明することができます。

答えて

4

私はこれがあなたの質問の中心であると思います。"私は混乱しています。私はオブジェクトを作成した後、同じオブジェクトに対してメソッドを実行し、まったく同じオブジェクトに格納する例は見たことがありません。

あなたは実際には「」と全く同じオブジェクトに保存されていません。あなたがしていることは、pointersobjectsを混同しています。

のは、ちょうどこの行を見てみましょう:この行で

string = [string stringByAppendingString:@"Hello"];

を 'string' は、それが指すpointer、ないobjectです。このコード行の意味は次のとおりです。 "pointer '文字列'で現在参照されているNSStringobjectこのテキストがテキストのテキストです。 pointer 'string'はその代わりにobjectを指します。

+0

はい、ありがとうございます。これはこれまでのところ最高の答えです。あなたはすべてのことを見てうれしいよ、笑。 ありがとうございます。 –

+1

この質問はダムと聞こえるかもしれませんが、ObjCではあまりプログラムしません。文字列は不変なので、元の文字列オブジェクトにポインタがないのでメモリリークが発生しません(stringByAppendingStringは新しい文字列オブジェクトを返すので) ? – styfle

+0

はい。古い文字列は、あなたが言うように逆参照されています。逆参照されたオブジェクトがオートリリースされている場合や 'NSString * cow = @" Milk "のように作成されたストリングリテラルの場合は、メモリリークのような文字列の場合は問題ありません。興味深いことに、このサイトのほとんどのメモリリークの質問は、ポインタとオブジェクトを混乱させる人々のようです。 – NJones

2
string = [string stringByAppendingString:[food componentsJoinedByString:@", "]]; 

は次に

NSString *tmpString = [food componentsJoinedByString:@", "]; 
string = [string stringByAppendingString:tmpString]; 

だから例では、最も内側の角括弧が最初に評価され、最も外側のと同じです。それはそれを少し明確にしていますか?実際の問題が1 * 2 * 3であることが分かる前に、(1 * 2 *(1 + 2))...内側の(*)評価が評価されます。それは[food componentsJoinedByString:@", "]で起こっていることです。

1

stringByAppendingStringは全く同じオブジェクトに文字列を格納していません。新しい(自動リリースされた)NSStringオブジェクトを作成するのは、1つのNSStringオブジェクトです。

NSSoundオブジェクトをある)chirpには同等の例ではありませんが、あなたはブランドの新しいNSSoundオブジェクトを返すようにする方法でNSSoundを拡張し、独自のカテゴリを作成しない限り。

意味がありますか?

ああ、滝沢のアイコンもありがとうございます。

+0

ありがとうございました。わかった。 –

関連する問題