Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2010-03-15

前記事の補足:プロパティへのnil代入がreleaseの代わりになる理由

| 03:18 | はてなブックマーク -  前記事の補足:プロパティへのnil代入がreleaseの代わりになる理由 - iPhoneアプリ開発まっしぐら★

こちらの記事について「なんでプロパティへのnil代入がreleaseの代わりになるの?」という質問をいただきましたので、ここで補足させていただきます。


アクセサの自動生成

プロパティ(property)には基本的に、

  • 値を参照するためのゲッター(getter)
  • 値を代入するためのセッター(setter)

の2つのアクセサが必要です。

Objective-Cでは、このアクセサを自動生成させることが可能です。

その「アクセサを自動生成してね」という指定が、

@synthesize brain;

というやつです。

↑の場合は、brainプロパティのアクセサを自動生成してね、という指定です。


ちなみに、アクセサを自動生成するにはプロパティ名と同じ名前のクラス変数が必要です。

自動生成されるアクセサの中身では、そのクラス変数に対して値の出し入れがされるのです。

もし、そのクラス変数名を違うものにしたいなら、

@synthesize brain = brain_;

というように指定します。この場合はbrain_というクラス変数がアクセサの中で使われることとなります。

いちおう、この場合のクラスとプロパティの宣言のサンプルも↓に。

@interface Human : NSObject
{
 @private
  id brain_;
}

@property (nonatomic, assign) id brain;

@end

自動生成されるアクセサの具体的なコード例(assignの場合)

assign属性のプロパティの場合、単純にクラス変数に値を代入したり参照したりするという扱いなので、自動生成されるアクセサは以下のようになります。

// getter
- (id)brain { 
  return brain_; 
} 
 
// setter
- (void)setBrain:(id)newBrain { 
 brain_ = newBrain; 
} 

ということは、このプロパティにnil代入するのは実際には以下に等しくなります。

  // self.brain = nil; は↓と同等
  brain_ = nil;

自動生成されるアクセサの具体的なコード例(retainの場合)

retain属性のプロパティの場合、値を代入するときには、代入する値に対してretainメッセージを送ると同時に、元から入っている値の参照カウンタを減らすために元の値に対してreleaseメッセージを送ることも必要です。具体的には以下のようなアクセサが自動生成されます。

// getter
- (id)brain { 
  return brain_; 
} 
 
// setter
- (void)setBrain:(id)newBrain { 
  if ( brain_ != newBrain ) { 
    [brain_ release]; 
    brain_ = [newBrain retain]; 
  }  
} 

ということは、このプロパティにnil代入するのは実際には以下に等しくなります。

  // self.brain = nil; は↓と同等
  if ( brain_ != nil ) { 
    [brain_ release]; 
    brain_ = nil;
  }  

これがプロパティへのnil代入がreleaseの代わりになる理由です。

iramusairamusa 2010/04/11 21:28 初見で恐縮ですが、
[newBrain retain]のnewBrainがnilに置き換わることで、retainメソッドを
呼び出そうとしてエラーになったりはしないんでしょうか。

tokoromtokorom 2010/04/12 01:25 nilオブジェクトに対するメッセージ送信はランタイムにより無視されるので大丈夫ですよー。
ここについては http://www.textdrop.net/google-styleguide-ja/objcguide.xml#nil_チェック などが参考になります。

DaveDave 2013/01/20 06:03 God, I feel like I sohlud be takin notes! Great work

znaymaiamznaymaiam 2013/01/20 22:37 HH52gE <a href="http://ayvoxvoezwth.com/">ayvoxvoezwth</a>

ゲスト



トラックバック - http://iphone-dev.g.hatena.ne.jp/tokorom/20100315