首页 > 网站 > 建站经验 > 正文

iOS 运行时添加!属性和方法

2019-11-02 14:47:07
字体:
来源:转载
供稿:网友

 

第一种:runtime.h里的方法BOOL class_addProperty(Class cls,    const char *name,    const objc_property_attribute_t *attributes,    unsigned int attributeCount)

#include <objc/runtime.h>#import <Foundation/Foundation.h>@interface SomeClass : NSObject {    NSString *_privateName;}@[email protected] SomeClass- (id)init {    self = [super init];    if (self) _privateName = @"Steve";    return self;}@endNSString *nameGetter(id self, SEL _cmd) {    Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");    return object_getIvar(self, ivar);}void nameSetter(id self, SEL _cmd, NSString *newName) {    Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");    id oldName = object_getIvar(self, ivar);    if (oldName != newName) object_setIvar(self, ivar, [newName copy]);}int main(void) {    @autoreleasepool {        objc_property_attribute_t type = { "T", "@/"NSString/"" };        objc_property_attribute_t ownership = { "C", "" }; // C = copy        objc_property_attribute_t backingivar  = { "V", "_privateName" };        objc_property_attribute_t attrs[] = { type, ownership, backingivar };        class_addProperty([SomeClass class], "name", attrs, 3);        class_addMethod([SomeClass class], @selector(name), (IMP)nameGetter, "@@:");        class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "[email protected]:@");        id o = [SomeClass new];        NSLog(@"%@", [o name]);        [o setName:@"Jobs"];        NSLog(@"%@", [o name]);    }}输出:SteveJobs第二种:- (id)valueForUndefinedKey:(NSString *)key第三种:static char c
探索宇宙[www.9-39.com/html/explore/]
onst * const ObjectTagKey;@implementation NSObject (ExampleCategoryWithProperty)@dynamic objectTag;- (id)objectTag { return objc_getAssociatedObject(self, ObjectTagKey);}- (void)setObjectTag:(id)newObjectTag { objc_setAssociatedObject(self, ObjectTagKey, newObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表