您好,欢迎来到外链网!
当前位置:外链网 » 站长资讯 » 专业问答 » 文章详细 订阅RssFeed

iOS RunTime机制让catagory能够增加属性

来源:互联网 浏览:51次 时间:2023-04-08

2019独角兽企业重金招聘Python工程师标准>>>

众所周知? catagory 只能给系统已有的类添加方法?? 不能添加属性。而RunTime 机制 给这种情况下添加属性提供了可能 ,利用runtime机制的objc_getAssociatedObject(self, KEY_TAGSTRING) 方法,能够简单有效的给系统类提供有效的方法??? 。一下给NSString 添加 字符串类型的tag 为例? (不仅可以添加 基本数据类型? 也可以添加 自定义的Model类型的)

代码如下

ViewTypeString.h

#import <UIKit/UIKit.h>#import "ViewTypeString.h"@interface UIView (ZFYType)@property (nonatomic, strong) NSString *tagString;@property (nonatomic, strong) ViewTypeString *model;- (UIView *)viewWithTagString:(NSString *)value;- (void)removeAssociatedObjects;@end

?

ViewTypeString.m

#import "UIView+ZFYType.h"#import <objc/runtime.h>#undef KEY_TAGSTRING#define KEY_TAGSTRING "tagString"@implementation UIView (ZFYType)@dynamic model;@dynamic tagString;- (ViewTypeString *)model { NSObject *obj = objc_getAssociatedObject(self, KEY_TAGSTRING); if (obj && [obj isKindOfClass:[ViewTypeString class]]) { return (ViewTypeString *)obj; } return nil;}-(void)setModel:(ViewTypeString *)model{ objc_setAssociatedObject(self, KEY_TAGSTRING, model, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSString *)tagString { NSObject *obj = objc_getAssociatedObject(self, KEY_TAGSTRING); if (obj && [obj isKindOfClass:[NSString class]]) { return (NSString *)obj; } return nil;}- (void)setTagString:(NSString *)value { objc_setAssociatedObject(self, KEY_TAGSTRING, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (UIView *)viewWithTagString:(NSString *)value { if (nil == value) { return nil; } for (UIView *subview in self.subviews) { NSString *tag = subview.tagString; if ([tag isEqualToString:value]) { return subview; } } return nil;}-(void)removeAssociatedObjects{ objc_setAssociatedObject(self, KEY_TAGSTRING, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);//移除当前对象 // 使用函数objc_removeAssociatedObjects可以断开所有associative。通常情况下不建议这么做,因为他会断开所有关联。}@end

?

?

?

?

下边是增加model 类型的 属性 代码:

?

其中 ViewTypeString.h 为自己定义的model 这里 代码就不放出来了

UIView+ZFYTagString.h

#import <UIKit/UIKit.h>#import "ViewTypeString.h"#import <objc/runtime.h>#undef KEY_TAGSTRING#define KEY_TAGSTRING "ZFYTagString"@interface UIView (ZFYTagString)@property (nonatomic, strong) NSString *tagString;- (UIView *)viewWithModelString:(NSString *)value;- (void)removeAssociatedObjects;@end

UIView+ZFYTagString.m

#import "UIView+ZFYTagString.h"#import <objc/runtime.h>@implementation UIView (ZFYTagString)@dynamic tagString;- (NSString *)tagString { NSObject *obj = objc_getAssociatedObject(self, KEY_TAGSTRING); if (obj && [obj isKindOfClass:[NSString class]]) { return (NSString *)obj; } return nil;}- (void)setTagString:(NSString *)value { objc_setAssociatedObject(self, KEY_TAGSTRING, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (UIView *)viewWithModelString:(NSString *)value { if (nil == value) { return nil; } for (UIView *subview in self.subviews) { NSString *tag = subview.tagString; if ([tag isEqualToString:value]) { return subview; } } return nil;}-(void)removeAssociatedObjects{ objc_setAssociatedObject(self, KEY_TAGSTRING, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);//移除当前对象 // 使用函数objc_removeAssociatedObjects可以断开所有associative。通常情况下不建议这么做,因为他会断开所有关联。}@end

?

转载于:https://my.oschina.net/iceTear/blog/685292

43108679