Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

@synthesize ivar declared in super class

タグ: Objective-C Mac iPhone
// .h
@interface Foo : NSObject
{
    int n;
}
@end

@interface Bar : Foo
@property int n;
@end
// .m
@implementation Foo
@end

@implementation Bar
@synthesize n;
@end

上記のコードは「Mac OS X(32-bit Universal)」や「iPhone Simulator」といったレガシーランタイム向けのコンパイルではエラーにならないが、iPhone SDK 3.0で「Mac OS X(32/64-bit Universal)」や「iPhone Device」といったモダンランタイム向けにコンパイルするとエラーになる。

error: property 'n' attempting to use ivar 'n' declared in super class of 'Bar'

これはモダンランタイムで 親クラスのインスタンス変数をsynthesizeすると親クラスのサイズが変わった時にクラッシュやら未定義動作を引き起こす要因になる(iPhone SDK Release Notes for iPhone OS 3.0 ためで、SDK 3.0ではこのようなコードがちゃんとコンパイルエラーになるように修正された。
モダンランタイムには 親クラスのインスタンス変数を並び替えてもそれを継承する子クラスを再ビルドする必要はない(Objective-C 2.0 Runtime Programming Guide: Runtime Versions and Platforms という利点があるが、おそらくこれはその辺に関係した問題なのだろう。

今回のようなコードなら、以下の様に書けば少なくともヘッダには影響を与えることなく対応できる。

// .m
@interface Foo ()
@property int n;
@end

@implementation Foo
@synthesize n;
@end

@implementation Bar
@dynamic n;
@end

もちろん、普通にsetterとgetterを書いてもいい。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/202-4d0bb64e
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。