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>

NastyaSwombNastyaSwomb 2018/03/04 19:39 * Массаж оказывает многообразное физиологическое воздействие на кожу:
<a href=http://kylerddcb62729.blogdigy.com/-4821386>тут</a>|

NastyaSwombNastyaSwomb 2018/03/05 18:16 * Под действием массажа в организме человека активизируются различные биологические стимуляторы – гормоны, ферменты, витамины; массажное воздействие увеличивает приток крови к больному органу, улучшает обмен веществ, очищает ткани и, в конечном счете, обеспечивает желаемый лечебный эффект.
{<a href=http://mediajx.com/story5371796/МАССАЖ-Веточка-сакуры-по-ссылке>{здесь|тут|click|here|web|page|blog|my blog|the blog|данные|источник|информация}</a>|

BobcatnomBobcatnom 2018/03/14 01:25 Компания Bobcat сегодня – крупнейший производитель строительной и сельскохозяйственной техники, имеющий более 900 дилеров в более 75 странах мира. Основной продукцией компании являются компактные экскаваторы, навесное оборудование и погрузчики с бортовым поворотом.
<a href=http://blzjc.com/story3168361/погрузчики-бобкет>источник</a>|

JACdrearJACdrear 2018/04/01 17:57 Область применения вилочных погрузчиков из Китая JAC

http://newtonapples.com/members/animezooy78/activity/419957/

ShippingnamShippingnam 2018/04/13 09:24 Железнодорожные перевозки
Современная сеть железных дорог достаточно развита, благодаря чему по ней могут транспортироваться грузы с самыми разными характеристиками. Таким способом перевозят отправления с разными массогабаритными показателями, требованиями к температурному режиму и степени защиты от атмосферных воздействий. Свойства и габариты груза, а также расстояние до пункта назначения – основные критерии, которые влияют на стоимость доставки.
<a href=http://www.pro-rzd.com/gruzovye-i-tovarnye-perevozki/logistika/jeleznodorozhnye-perevozki.html>в статье</a>|

LubovVieltLubovVielt 2018/04/27 09:49 Согласно действующему российскому праву, сделки с недвижимостью подлежат обязательной государственной регистрации и считаются заключенными только при условии такой регистрации. При этом регистрирующий орган производит соответствующую запись в Единый государственный реестр прав на недвижимое имущество и сделок с ним (ЕГРП). Сделка с недвижимостью (приватизация, мена, дарение, завещание, купля-продажа, рента) при отсутствии государственной регистрации считается незаключенной и не несет правовых последствий. При этом регистрации подлежит переход права собственности по данному договору. В России регистрацию сделок с недвижимостью ведет специальный государственный орган — Федеральная служба государственной регистрации, кадастра и картографии. Существует две формы заключения сделок — нотариальная и простая письменная, имеющие совершенно одинаковую юридическую силу.
<a href=http://shaneukap93692.shotblogs.com/>sayty</a>|

AnnacokAnnacok 2018/05/02 02:29 Лучшие новостные заголовки СМИ за 2017 год:
В Киеве нашли подпольный цех по производству рахат-лукума
Блоги о недвижимости
<a href=https://ganjagemini.tumblr.com>Источник: Блог о недвижимости...</a>|
<a href=https://alinekalessi.tumblr.com>Источник: Блог о недвижимости...</a>|

ゲスト



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