2011-09-17 6 views
0

私はObjective-Cを初めて使い、ポインタの概念について助けが必要です。私はこのコードを書いた:配列のポインタを理解する

//myArray is of type NSMutableArray 
NSString *objectFromArray = [myArray objectAtIndex:2]; 
[objectFromArray uppercaseString]; 

私は実際のポインタを持っているので、これはmyArray [2]で文字列を変更すると仮定しました。デリファレンスされたポインタを変更しても、その場所のオブジェクトが変更されるということはありませんか?それとも、これは「文字列不変性」と関係がありますか?いずれにしても、NSLogを使用してmyArrayを反復すると、すべての文字列はまだ小文字です。

+2

オレはあなたに必要な答えを与えます。しかし、ObjCの新しい人のためのいくつかの追加のガイダンス、私はそれがObjCオブジェクトへのポインタを*ポインタ*として考えることはできません。 objcのブラケット記法、ドット表記などで「メッセージ」することができる「オブジェクト」と考えることができます。明示的な逆参照、ポインタ算術などのようなポインタを使用しようとすると、ほとんど常に間違った方法ですしばしば悪いことが起こります。 – jemmons

+0

チップをありがとう。以前はポインタの基本的なアイデアがありましたが、ObjCを学んだ後、私はすべてを忘れてしまったような気がします:D – XSL

+0

正直なところ、おそらく最高です;-) – jemmons

答えて

2

逆参照されたポインタを変更しても、その場所のオブジェクトが変更されることはありませんか?

はい、そうです。しかし、uppercaseStringのドキュメントを読むと、文字列が変更されていないことがわかります。むしろ、元の文字列の新しい大文字バージョンを返します。 NSStringのすべてのメソッドは、そのように動作します。

内容を変更するには、NSMutableStringのインスタンスが必要です。しかしNSMutableStringには対応する大文字の方法がありませんので、自分で書く必要があります(カテゴリはNSMutableString)。

+0

ありがとうございました。 – XSL

-1

もちろん!配列の文字列はステートメント[objectFromArray uppercaseString]のように大文字に変換されません。しかし、どんなオブジェクトでも収集されなかった大文字の文字列を返すでしょう。 "uppercaseString"は、呼び出される文字列オブジェクト自体を変更しません... !!