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

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

  • 首先应该讲值转成对象进行存储
  • 其次应该注意转成对象之后的保存策略模式
    以 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)];
    //因为已经把 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 了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容