iOS 运行时添加属性和方法

原文链接http://blog.csdn.net/meegomeego/article/details/18356169

第一种
:runtime.h里的方法

BOOL class_addProperty(Class cls,constchar*name,constobjc_property_attribute_t*attributes,unsignedint attributeCount)
#include <objc/runtime.h>

#import <Foundation/Foundation.h>



@interface SomeClass : NSObject {

    NSString *_privateName;

}

@end



@implementation SomeClass

- (id)init {

    self = [super init];

    if (self) _privateName = @"Steve";

    return self;

}

@end

NSString *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, "v@:@");



        id o = [SomeClass new];

        NSLog(@"%@", [o name]);

        [o setName:@"Jobs"];

        NSLog(@"%@", [o name]);

    }

}

输出:

Steve

Jobs
第二种:
-(id)valueForUndefinedKey:(NSString*)key

 

第三种:

static char const * 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);

}

 

你可能感兴趣的:(属性和方法)