プロパティの属性

@property宣言のあとに、括弧を付けて、そこに様々な属性を付加することができる。これが、プロパティをただのシンタックスシュガーにせず、非常に使い手のあるものにしている。これらを紹介しよう。

アクセス制限

まず、プロパティへのアクセス制限を指示するものがある。readonlyとreadwriteだ。

  • readonly: プロパティのアクセスが、読み込みのみである、と指定する

  • readwrite: プロパティのアクセスが、読み込み/書き込み可能である、と指定する

readonlyとreadwriteの指定は、排他的になる。デフォルトは、readwriteだ。

setterアクセッサの挙動

次は、オブジェクトの設定に関するものだ。つまり、setterアクセッサの挙動を決定するものになる。これには、assign、copy、retainの3つがある。

  • assign: 単純にオブジェクトを設定する

  • copy: オブジェクトをコピーして設定する

  • retain: 設定するときにretainを呼び出す

assignは、単純にオブジェクトの値をインスタンス変数に設定するものになっている。鋭い方なら気づくと思うが、これはガベージコレクションの使用を前提にしている。デフォルトはassignになっているので、ガベージコレクションを無効にしてプロパティを使おうと思っている方は気を付けてほしい。

スレッドの制御

スレッドの制御に関するものもある。デフォルトでは、プロパティへのアクセスはスレッドセーフだ。これは、アクセスする際はそのオブジェクトを使ってロックがかけられることを意味している。そのロックをあえて外すこともできる。それにはnonatomicを使う。パフォーマンスを上げる場合などに使えるだろうが、使用には注意が必要だ。

  • nonatomic: アクセスする際にロックを行わない

アクセッサの名前

最後に、プロパティのためのアクセッサの名前を指定することもできる。getter、setterを使う。デフォルトだと、キー値コーディングのルールに則った名前になる。

  • getter=getterName, setter=setterName: それぞれgetterName、setterNameとして、アクセッサメソッドの名前を指定する