@propertyの属性にcopyとかstrongとかweakとかあるけど、概念的な説明はどこでもあるけど、具体的な説明をしている記事が少ないので調査した。
Xcode4.3.2時点での内容です。
nonatomic
非スレッドセーフにする。マルチスレッドのものを使わない限りはどんどん指定しよう。
ちなみにatomicな場合は内部的にはgetterは以下のような処理になる模様。ロックが入ってしまう。
ちなみにatomicな場合は内部的にはgetterは以下のような処理になる模様。ロックが入ってしまう。
getter/setter
getterとsetterのメソッド名はデフォルトで、getterは変数名と同じ、setterはset[Capitalize変数名]だが、それを任意のものに設定することができる。
readonly時にsetterは指定できない(当たり前だが)
通常変更する必要はないが、isなんたら とかってgetterにしたい場合に使うといいらしい。
readonly時にsetterは指定できない(当たり前だが)
通常変更する必要はないが、isなんたら とかってgetterにしたい場合に使うといいらしい。
readwrite/readonly
readwriteはデフォルトなので、単品で指定することはまずない。readonlyはその名の通りsetterが生成されなくなる。self.prop = 1;みたいなドットでのアクセスすらコンパイルエラーになるので、このままだと何もできない変数になる気がする。
.hではreadonlyにして、.mでreadwriteにして定義を上書きすることで、クラス内部では読み書きができ、外部では読み出ししかできないプロパティが出来上がる。
.hではreadonlyにして、.mでreadwriteにして定義を上書きすることで、クラス内部では読み書きができ、外部では読み出ししかできないプロパティが出来上がる。
.h
.m
strong/copy/retain/assign
- ARCを使わない場合はassignがデフォルト、使う場合はstrongがデフォルト。
- copyとreleaseは、以前の値に対しreleaseが呼ばれる。
- retainは参照カウントが保持されて、assignは保持されないらしい。
- copyはNSCopyingプロトコルが実装されていないオブジェクトに対して設定すると落ちる。NSObjectだけだと実装されていないので、使用する際は注意。
- ARCを無効にしてテスト
TestString.h
TestString.m
TestData.h
TestData.m
上記のようなコードがあった場合、[ここを任意に変更]が以下を指定した場合に、
というコードを動かした場合、以下のような結果になる。(コメントはその行を通過直後に発生されるログ)
strongは、最後に代入したstring2の所有権がdataに移っているので、外からstring2をreleaseしてもデストラクタが呼ばれない。
copyはcopyなので、外でreleaseするとデストラクタが呼ばれる。またcopyは、自分自身が入れ替わると、入れ替わる前の値はreleaseされるので、setTitle:string2でもデストラクタが呼ばれている。
assignは内部でどう扱おうが知ったことではないという感じ。外でreleaseするとdataのtitleもreleaseされているので、テストコードで言うところの、[data release];の直前でdataのtitleを扱おうとするとEXC_BAD_ACCESSとなる。参照だけを単純に代入すると考えるといい。あとスカラー型はassignでもコピー。
retainは基本的にstrongと同じ。内部的にretainというメソッドがあり、それを使って、「hoge = [fuga retain]」のように代入すると、strongと同じような効果が得られるため、そういうものがあるらしい。
strongは、最後に代入したstring2の所有権がdataに移っているので、外からstring2をreleaseしてもデストラクタが呼ばれない。
copyはcopyなので、外でreleaseするとデストラクタが呼ばれる。またcopyは、自分自身が入れ替わると、入れ替わる前の値はreleaseされるので、setTitle:string2でもデストラクタが呼ばれている。
assignは内部でどう扱おうが知ったことではないという感じ。外でreleaseするとdataのtitleもreleaseされているので、テストコードで言うところの、[data release];の直前でdataのtitleを扱おうとするとEXC_BAD_ACCESSとなる。参照だけを単純に代入すると考えるといい。あとスカラー型はassignでもコピー。
retainは基本的にstrongと同じ。内部的にretainというメソッドがあり、それを使って、「hoge = [fuga retain]」のように代入すると、strongと同じような効果が得られるため、そういうものがあるらしい。
copy
strong
assign
retain
weak
weakはARCを有効にしないと使えない。assignと同等。
コメント
コメントを投稿