iOS 運行時添加屬性和方法

來源:互聯網
上載者:User

 

第一種: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);}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.