Objective-C カテゴリにプリミティブ型のプロパティを追加

カテゴリにプリミティブ型のプロパティを持たせる方法を調査したのでメモ

基本的にはググるとたくさん出てくる方法の通り objc_setAssociatedObjectobjc_getAssociatedObject を使う

例えばUIButtonにenum型のプロパティをカテゴリ拡張で持たせるとすると以下のようになる

MyButtonDefine.h

#ifndef MyButton_Define_h
#define MyButton_Define_h

typedef NS_ENUM(NSInteger, MyButtonType)
{
    HogeHogeType    = 1,
    PiyoPiyoType    = 2,
};

#endif

UIButton+TakkuMattsuCustom.h

#import <UIKit/UIKit.h>
#import "MyButtonDefine.h"

@interface UIButton (TakkuMattsuCustom)
@property (nonatomic) MyButtonType buttonType;
@end

UIButton+TakkuMattsuCustom.m

#import "UIButton+TakkuMattsuCustom.h"
#import <objc/runtime.h>

@implementation UIButton (TakkuMattsuCustom)

- (void)setButtonType:(MyButtonType)buttonType
{
    id value = [NSNumber numberWithInteger:buttonType];
    objc_setAssociatedObject(self,
                             @selector(buttonType),
                             value,
                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (MyButtonType)buttonType
{
    id value = objc_getAssociatedObject(self, @selector(buttonType));
    return [value integerValue];
}

@end

プリミティブ型をNSNumber型でラップしているだけ