Objective-C のカテゴリでプロパティを定義する方法のメモ

objc/runtime.h で定義されている、objc_getAssociatedObject メソッドと objc_setAssociatedObject を使う。

#import <UIKit/UIKit.h>

@interface UIViewController (SideMenu)

@property (nonatomic, readonly) UIBarButtonItem *menuButtonItem;

@end
#import "UIViewController+SideMenu.h"
#import <objc/runtime.h>
#import <FontAwesomeKit/FontAwesomeKit.h>

@implementation UIViewController (SideMenu)

- (UIBarButtonItem *)menuButtonItem
{
    id item = objc_getAssociatedObject(self, _cmd);
    if (item == nil)
    {
        FAKFontAwesome *icon = [FAKFontAwesome barsIconWithSize:20];
        UIImage *image = [icon imageWithSize:CGSizeMake(20, 20)];
        UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithImage:image
                                                                style:UIBarButtonItemStylePlain
                                                               target:self
                                                               action:@selector(openSideMenu)];
        objc_setAssociatedObject(self,
                                 _cmd,
                                 btn,
                                 OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        item = btn;
    }
    return (UIBarButtonItem*)item;
}

- (void)openSideMenu
{
    // TODO: サイドメニューを表示
}

@end

上のサンプルでは、第2引数で指定する key にセレクタを使っている。_cmd は現在のメソッドを表す特殊なセレクタ