誰も得しない(含む 俺)
Objective-Cはプロパティに関してはruntimeを完全に二分してしまった。Appleはそれらをmodern runtimeとlegacy runtimeと呼んでる。
違いはプロパティの定義にある。
@interface AClass : NSObject @property (retain) NSString *title; @end @implementation @synthesize title; @end
このようにプロパティに対応するインスタンス変数がない場合に@synthesizeでアクサセを自動生成しようとすると、legacy runtimeでは対応するインスタンス変数がないためエラーが発生する。だが、modern runtimeではアクセサだけでなくその実体すら自動で生成されるのだ。
で、legacy runtimeでも擬似的にそれを実現してみた。
かなり長いのでgistでどうぞ。
実現のためにAssociatedObjectを使っているのだがこれはMac OS X 10.6 and laterなため、これを利用可能、そして意味のあるのは
ということになる。
Snow Leopardが走る 2が付かないIntel Coreが乗ったMacだけ。
極めてターゲットが狭い。
誰も得しませんw
やってるのは、
- +[NSObject allocWithZone:]を書き換えて自動生成メソッドを呼び出す
- プロパティを調べてアクセッサを追加する
- アクセッサはAssociatedObjectを使い値をやり取りする
使用する際は@synthesizeではなく@dynamicを使う必要があります。
また、オブジェクトを含む単純型とNSSize, NSPoint, NSRect, NSRange, CGSize, CGPoint, CGRect以外のプロパティのアクセサは生成されません。
そして、とりあえず動いているように見える、程度のものです。