誰も得しない(含む 俺)

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


やってるのは、

  1. +[NSObject allocWithZone:]を書き換えて自動生成メソッドを呼び出す
  2. プロパティを調べてアクセッサを追加する
  3. アクセッサはAssociatedObjectを使い値をやり取りする


使用する際は@synthesizeではなく@dynamicを使う必要があります。
また、オブジェクトを含む単純型とNSSize, NSPoint, NSRect, NSRange, CGSize, CGPoint, CGRect以外のプロパティのアクセサは生成されません。


そして、とりあえず動いているように見える、程度のものです。