iOS - 关于动态绑定结构体属性

写工程的时候遇到个问题,想要在 category 中添加一个结构体的属性,自然会想到使用 runtime 的动态绑定,但是添加结构体属性会与别的属性有些不同,有几个注意点:

  • 首先应该讲值转成对象进行存储
  • 其次应该注意转成对象之后的保存策略模式
    以 CGRect 属性为例:
#import 
@interface UIViewController (PushPopMessage)
@property (nonatomic)CGRect pushFrame;
@end
#import "UIViewController+PushPopMessage.h"
#import 
@dynamic pushFrame;
@implementation UIViewController (PushPopMessage)
-(void)setPushFrame:(CGRect)pushFrame{
    NSValue *value = [NSValue value:&pushFrame withObjCType:@encode(CGRect)];
    //因为已经把 pushFrame 作为对象进行存储 所以也应该将存储的策略模式设置为对象的策略模式
    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 了。

你可能感兴趣的:(iOS - 关于动态绑定结构体属性)