在學(xué)習(xí)iOS過(guò)程中遵班,慢慢地接觸到了Objective-C里高級(jí)語(yǔ)法忧换,了解到AOP編程的獨(dú)特之處,感受到了其強(qiáng)大蜻牢。想借此暫時(shí)簡(jiǎn)單記錄下現(xiàn)在對(duì)于Objc運(yùn)行時(shí)語(yǔ)法的運(yùn)用烤咧。
首先,使用運(yùn)行時(shí)API抢呆,就要包含
#import <objc/runtime.h>
#import <objc/message.h>
創(chuàng)建并注冊(cè)類(lèi)和成員變量
Class WidgetClass = objc_allocateClassPair([NSObject class], "Widget", 0);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// 參數(shù)type 特殊編碼要求 v-void @-self(id)
class_addMethod(WidgetClass, @selector(display), (IMP)display, "v@:");
#pragma clang diagnostic pop
/** * 為 類(lèi) 添加實(shí)例變量 */
char const *height = "height";
class_addIvar(WidgetClass, height, sizeof(id), log2(sizeof(id)), "@");
objc_registerClassPair(WidgetClass);
使用動(dòng)態(tài)創(chuàng)建的類(lèi)
id widget = [[WidgetClass alloc]init];
NSNumber *value = [NSNumber numberWithInt:10];
[widget setValue:value forKey:[NSString stringWithUTF8String:height]];
NSLog(@"%@---%@",[widget valueForKey:[NSString stringWithUTF8String:height]],[[widget valueForKey:[NSString stringWithUTF8String:height]] class]);
給創(chuàng)建的類(lèi)實(shí)例添加一個(gè)成員變量
NSNumber *width = [NSNumber numberWithInt:15];
const char *key = "width";
objc_setAssociatedObject(widget,key,width,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
id result = objc_getAssociatedObject(widget,key);
總結(jié)
1.首先定義一個(gè)方法的實(shí)現(xiàn)參數(shù)(c函數(shù)煮嫌,必有兩個(gè)參數(shù)self , _cmd )
2.創(chuàng)建并且注冊(cè)一個(gè)類(lèi)以及它的metaClass
3 創(chuàng)建一個(gè)類(lèi)的實(shí)例
4.動(dòng)態(tài)方式給實(shí)例添加一個(gè)變量 (可用于在分類(lèi)中添加實(shí)例變量)