寫(xiě)工程的時(shí)候遇到個(gè)問(wèn)題,想要在 category 中添加一個(gè)結(jié)構(gòu)體的屬性,自然會(huì)想到使用 runtime 的動(dòng)態(tài)綁定,但是添加結(jié)構(gòu)體屬性會(huì)與別的屬性有些不同,有幾個(gè)注意點(diǎn):
- 首先應(yīng)該講值轉(zhuǎn)成對(duì)象進(jìn)行存儲(chǔ)
- 其次應(yīng)該注意轉(zhuǎn)成對(duì)象之后的保存策略模式
以 CGRect 屬性為例:
#import <UIKit/UIKit.h>
@interface UIViewController (PushPopMessage)
@property (nonatomic)CGRect pushFrame;
@end
#import "UIViewController+PushPopMessage.h"
#import <objc/runtime.h>
@dynamic pushFrame;
@implementation UIViewController (PushPopMessage)
-(void)setPushFrame:(CGRect)pushFrame{
NSValue *value = [NSValue value:&pushFrame withObjCType:@encode(CGRect)];
//因?yàn)橐呀?jīng)把 pushFrame 作為對(duì)象進(jìn)行存儲(chǔ) 所以也應(yīng)該將存儲(chǔ)的策略模式設(shè)置為對(duì)象的策略模式
objc_setAssociatedObject(self, @"pushFrame", value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(CGRect)pushFrame{
NSValue *value = objc_getAssociatedObject(self, @"pushFrame");
if(value) {
CGRect rect;
[value getValue:&rect];
return rect;
}else {
return CGRectZero;
}
}
- 這樣就可以拿到 pushFrame 了。