萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> ios >> iOS 運行時添加屬性和方法

iOS 運行時添加屬性和方法

 

第一種: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);}
copyright © 萬盛學電腦網 all rights reserved