2)定义一个委托转载对象,因为dynamic对象不能直接用匿名方法,这里用对象去承载:
3) 定义一个动态对象:
需要动态属性的时候需要用到dynamic class
static class的实例不能添加动态属性
dynamic class的实例可以动态添加属性
举例:
// MovieClip是动态类var mc:MovieClip = new MovieClip()
// 动态添加一个属性member,值为true
mc.member = true
// Sprite是静态类
var s:Sprite = new Sprite()
// 动态添加属性会报错
错误:s.member = true
第一种: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}@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, "v@:@") id o = [SomeClass new] NSLog(@"%@", [o name]) [o setName:@"Jobs"] NSLog(@"%@", [o name]) }}输出:SteveJobs 第二种:- (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)}欢迎分享,转载请注明来源:内存溢出
评论列表(0条)