第2月第6天 iOS 运行时添加属性和方法
2016-11-06 18:17
232 查看
http://blog.csdn.net/meegomeego/article/details/18356169
第一种: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; } @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); }
相关文章推荐
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS 运行时添加属性和方法
- iOS动态性:动态添加属性的方法——关联(e.g. 向Category添加属性)
- iOS开发之category动态添加属性的方法------关联
- IOS运行时传递对象或者添加属性
- iOS 利用运行时机制给现有类添加属性
- iOS-利用运行时给分类添加属性
- c# 对象运行时动态添加属性、方法
- iOS利用运行时给分类添加属性
- iOS控件TextView添加placeholder属性的两种方法
- iOS 面试题(十):runtime 使用——(动态添加方法/动态交换方法/动态添加属性)
- iOS:runtime的使用(动态添加方法、关联方法、交换方法、遍历私有属性)
- ios动态添加属性的几种方法
- iOS运行时初探-使用运行时机制向Category中添加属性
- [iOS]添加 All Exceptions 断点后, 每次运行都会在 main.m 中断的一种解决方法