へろへろもへじ

(ブログタイトル募集中)

【Objective-C,iOS】カテゴリでプロパティを追加する方法

同い年の同僚がはてなブログを書き始めたことに感化されたので、この機会にちょっと外に発信してみようかと思います。最近ObjCを勉強し始めたので備忘録も兼ねて。
何かとツッコミどころ満載かと思いますので、コメントを頂けると幸いでございますm(__)m

で、本題ですが。
カテゴリってjsのプロトタイプライクで便利じゃーんと思って、よく利用するようなメソッドは継承ではなく既存クラスのカテゴリを作って追加していたのですが、ちょっと痒いところに手が届かない印象。。そう感じた理由が、
インスタンス変数を追加できない」
つまり、アクセサメソッド(いわゆるgetter,setter)を作れないという仕様です。・・・が、ググったら頑張ればできることが判明。

以下、手順になります。

.h(ヘッダ)ファイルに以下を追加する。

@property id<HogeDelegate> hogeDelegate;

.m(メソッド)ファイルに@dynamicで宣言する。

@dynamic hogeDelegate;

setter、getterは自前で作る。(※ここがポイント)

 // <objc/runtime.h>のモジュール使うのでヘッダーでimportしておく

- (void)setHogeDelegate:(id<HogeDelegate>)hogeDelegate
{
     objc_setAssociatedObject(self, @"hogeDelegate", hogeDelegate, OBJC_ASSOCIATION_RETAIN);
}

- (id<HogeDelegate>)hogeDelegate
{
     return objc_getAssociatedObject(self, @"hogeDelegate");
}


これでできましたー、Javaでいうところのリフレクションですね。
一生懸命@syntesizeを使おうとしてました。。。
参考にさせて頂いたSeasonsさんの記事に感謝ですm(__)m

                                      • -

◆動作環境
Mac OS X 10.8.2
XCode 4.5.2

◆参考URL
iOS 3.1から使えるようになった Associated Objectsについて - Seasons.NET