2011-07-02 5 views
0

を初期化していない、私は次のオブジェクトを客観Cで

UIImage *myImage = [UIImage imageNamed:@"myPhoto.jpg"]; 
variable.image = myImage; 

を行うことができ、これはうまく動作します。 "myImage"という名前のオブジェクトは初期化されず、UIImageにはメモリが割り当てられていませんでしたが、コードはまだ動作します。

ここで何が起こっているのか誰かが説明できますか?

答えて

2

はい、オブジェクトは初期化されました。 imageNamed:メソッドは、オブジェクトを割り当てて初期化し、autoreleaseメッセージを送信してから、メモリアドレスを返します。そのメモリアドレスはmyImageというポインタに格納します。

myImageこのオブジェクトは2つの異なるものです。 myImageは単にメモリ位置を指すだけです。それはオブジェクトそのものではありません。

オブジェクトを変数に代入することなく渡すことができ、1つのオブジェクトを多くの変数に割り当てることができます。画像がコピーされなかった

UIImage *imageOne; 
UIImage *imageTwo; 

imageOne = [UIImage imageNamed:@"myPhoto.jpg"]; 
imageTwo = imageOne; 

はこのことを考えてみましょう。存在するオブジェクトは1つだけです。どちらの変数もそれを指しています。あなたが任意の変数に代入しませんでした

NSLog(@"%@", [UIImage imageNamed:@"myPhoto.jpg"]); 

今、このことを考慮してください。しかし、オブジェクトはまだ存在しました、そうですか?

+0

これは目を開くものです。ありがとうございました。 最後の質問です...オブジェクトが正確に何であるか、私は常にポインターがオブジェクトだと思っていました。たとえば、.. NSString * myString = [[NSString alloc] initWithString:@ "Hello"]; 私は* myStringがオブジェクトだと思っていました。 – Sean

+0

ポインタはポインタです。ポインタはオブジェクトを指します。 2つのポインタが同じオブジェクトを指すことができます。とった? – Yuji

+0

Ohhhhh ..ハハ、ありがとう。私は皆さんが大好きです。分かりました。それは今すべてがより簡単になります。 – Sean

0

documentationUIImageをご覧ください。 "キャッシュされたイメージ読み込みルーチン"と "新しいイメージの作成"という見出しの下には+といういくつかのメソッドがあり、-が必要です。つまり、これらのメソッドを呼び出すことは、[[[UIImage alloc] init] autorelease];を呼び出すのと同じですが、カスタムの初期化の場合と同じように、これらのメソッドのうちのいくつかは多くなります。

他の多くのObjective Cオブジェクトにも同様のメソッドがあります。たとえば、NSArrayには、空の配列を作成して返します。+(id)arrayがあります。主なインジケータは-の代わりに+ですが、私はドキュメントをチェックして初期化の処理方法を確認し、オブジェクトがオートリリースされていることを確認します。

+0

これは「便利な方法」として知られています。 Cocoaには[非常に一貫した慣習](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership)があります。html)を使用して、Cocoaメソッドによって返されたオブジェクトのメモリ管理ルールを知っているので、ルールを知ったら、各メソッドのドキュメントをチェックする必要はありません。 '+'と '' ''は、メソッドがクラスメソッドであるかインスタンスメソッドであるかを示しますが、この問題には直接関係しません。 – Jim