iOS高級(jí)開發(fā)runtime那點(diǎn)事實(shí)戰(zhàn) (3)

添加類

objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes)
添加類 superclass 類是父類   name 類的名字  size_t 類占的空間

void objc_disposeClassPair(Class cls) 銷毀類


void objc_registerClassPair(Class cls) 注冊(cè)類


objc_duplicateClass
 Used by Foundation's Key-Value Observing.官方說法是不讓自己調(diào)用
Do not call this function yourself. 

具體代碼:

- (void)allocClass{
    Class clas = objc_allocateClassPair(NSClassFromString(@"FY"), "FYss", 0);
   
    objc_property_attribute_t type = {"T", "@\"NSString\""};
    objc_property_attribute_t ownership = { "C", "" };
    objc_property_attribute_t backingivar = { "V", "_ivar1"};
    objc_property_attribute_t attrs[] = {type, ownership, backingivar};
 
 bool success =    class_addProperty(clas, "nameIvar", attrs, 3);
    if (success) {
        NSLog(@"addIvar success");
        if (class_isMetaClass(clas)) {
            NSLog(@"是一個(gè)類");
        }
    }
     objc_registerClassPair(clas);
    [self printPropreListClass:clas];
}

實(shí)例化類

// 創(chuàng)建類實(shí)例

id class_createInstance ( Class cls, size_t extraBytes );



// 在指定位置創(chuàng)建類實(shí)例

id objc_constructInstance ( Class cls, void *bytes );



// 銷毀類實(shí)例

void * objc_destructInstance ( id obj );

實(shí)例

id object_copy(id obj, size_t size) //拷貝obj

id object_dispose(id obj)   //釋放obj

Ivar object_setInstanceVariable(id obj, const char *name, void *value) //修改實(shí)例的值

Ivar object_getInstanceVariable(id obj, const char *name, void **outValue) //獲取實(shí)例

OBJC_EXPORT void *object_getIndexedIvars(id obj) //獲取obj的index

id object_getIvar(id object, Ivar ivar) //獲取obj的ivar

void object_setIvar(id object, Ivar ivar, id value) //賦值ivar給obj默認(rèn)值是value

const char *object_getClassName(id obj) //獲取類的名字

Class object_getClass(id object) //獲得 類

Class object_setClass(id object, Class cls)  //把obj 改到cls的類下

int objc_getClassList(Class *buffer, int bufferLen) //獲取class列表

Class *objc_copyClassList(unsigned int *outCount) //拷貝類數(shù)組

id objc_lookUpClass(const char *name) // 看看是否 注冊(cè)了類

id objc_getClass(const char *name) //獲取類

id objc_getRequiredClass(const char *name) //要是沒有這個(gè)類就kill 這個(gè)類 

const char * ivar_getName( Ivar ivar) //獲取var的名字

const char * ivar_getTypeEncoding( Ivar ivar) //獲取ivar 的 type

ptrdiff_t ivar_getOffset( Ivar ivar) //

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) //給類別添加 屬性

id objc_getAssociatedObject(id object, void *key) //獲取屬性

void objc_removeAssociatedObjects(id object) //刪除屬性

發(fā)送消息

id objc_msgSend(id self, SEL op, ...)// id 發(fā)送消息給SEL op

double objc_msgSend_fpret(id self, SEL op, ...)// 和上邊的一樣這個(gè)用i386平臺(tái)摧茴,PPC和PPC64不能用赘理。

void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector, ...)// 有返回值的消息  stretAddr 是返回值 theReceiver接收消息的id SEL 是方法名

id objc_msgSendSuper(struct objc_super *super, SEL op, ...)//給父類方法發(fā)送消息

void objc_msgSendSuper_stret(struct objc_super *super, SEL op, ...)//給父類添加消息 

當(dāng)我們用OC調(diào)用方法的時(shí)候翘紊,其實(shí)底層是obj發(fā)送消息的過程换薄,就夠obj發(fā)送消息給SEL鞠呈,然后objruntime中會(huì)在objSELList中尋找融师,當(dāng)然不是每次都去遍歷所有的方法的,而是在methodCache粟按,它會(huì)先去常用的方法cache在中查找诬滩,要是cache中沒有這個(gè)方法,再去遍歷所有的方法灭将。參考:Runtime源碼點(diǎn)這里

具體測(cè)試

    objc_msgSend(self,@selector(msgTest));

-(void)msgTest{
    NSLog(@"調(diào)用了我 objc_msgSend");
}

輸出:2016-03-23 15:06:18.011 runTimeObj[46084:3861049] 調(diào)用了我 objc_msgSend
id method_invoke(id receiver, Method m, ...) 調(diào)用receiver的方法 id 不能是nil

void method_invoke_stret(id receiver, Method m, ...) //Using this function to call the implementation of a method is faster than calling method_getImplementation and method_getName. 官方描述就是比method_getName和method_getImplementation塊

IMP method_getImplementation( Method method) //指向IMP的方法指針
IMP是什么疼鸟?本質(zhì)上是一個(gè)指針,指向方法的指針庙曙,俗名就是函數(shù)指針空镜。

const char * method_getTypeEncoding( Method method) //方法type 返回一個(gè)c字符串

char * method_copyReturnType( Method method) 方法返回的類型 一個(gè)c字符串 用完要free(char *)的

unsigned method_getNumberOfArguments( Method method) //方法的元素?cái)?shù)量

void method_getArgumentType( Method method, unsigned int index, char *dst, size_t dst_len) 獲取method 索引是index的參數(shù) 值賦給dst 要是dst = nil;系統(tǒng)自動(dòng)調(diào)用strncpy(dst, "", dst_len)

IMP method_setImplementation( Method method, IMP imp) 把imp賦給method 

void method_exchangeImplementations( Method m1, Method m2) 交換兩個(gè)方法
例如:IMP imp1 = method_getImplementation(m1);
     IMP imp2 = method_getImplementation(m2);
         method_setImplementation(m1, imp2);
         method_setImplementation(m2, imp1);
const char * * objc_copyImageNames(unsigned int *outCount)//返回所有加載的Objective-C框架和動(dòng)態(tài)庫的名字。

const char *class_getImageName(Class cls)//獲取class的動(dòng)態(tài)庫的名字

const char * *objc_copyClassNamesForImage(const char *image, unsigned int *outCount) //拷貝動(dòng)態(tài)庫

const char* sel_getName(SEL aSelector) //獲取SEL的字符串名字

SEL sel_registerName(const char *str) //注冊(cè)SEL 名字是str 返回注冊(cè)成功的SEL

SEL sel_getUid(const char *str) //獲取str的方法SEL指針

BOOL sel_isEqual(SEL lhs, SEL rhs) //判斷兩個(gè)SEL是否是同一個(gè)SEL 


今天就到這吧吴攒,明天吧協(xié)議和屬性看了张抄。更多文章在www.fgyong.cn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洼怔,隨后出現(xiàn)的幾起案子署惯,更是在濱河造成了極大的恐慌,老刑警劉巖镣隶,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件极谊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡安岂,警方通過查閱死者的電腦和手機(jī)轻猖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來域那,“玉大人咙边,你說我怎么就攤上這事〈卧保” “怎么了败许?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翠肘。 經(jīng)常有香客問我檐束,道長,這世上最難降的妖魔是什么束倍? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任被丧,我火速辦了婚禮,結(jié)果婚禮上绪妹,老公的妹妹穿的比我還像新娘甥桂。我一直安慰自己,他們只是感情好邮旷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布黄选。 她就那樣靜靜地躺著,像睡著了一般婶肩。 火紅的嫁衣襯著肌膚如雪办陷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天律歼,我揣著相機(jī)與錄音民镜,去河邊找鬼。 笑死险毁,一個(gè)胖子當(dāng)著我的面吹牛制圈,可吹牛的內(nèi)容都是我干的们童。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲸鹦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼慧库!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馋嗜,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤齐板,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后葛菇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體覆积,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年熟呛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尉姨。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庵朝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出又厉,到底是詐尸還是另有隱情九府,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布覆致,位于F島的核電站侄旬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏煌妈。R本人自食惡果不足惜儡羔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望璧诵。 院中可真熱鬧汰蜘,春花似錦、人聲如沸之宿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽比被。三九已至色难,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間等缀,已是汗流浹背枷莉。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留项滑,地道東北人依沮。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓涯贞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親危喉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宋渔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,719評(píng)論 0 9
  • 我們常常會(huì)聽說 Objective-C 是一門動(dòng)態(tài)語言辜限,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢皇拣?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評(píng)論 0 7
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 763評(píng)論 0 1
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡(jiǎn)介 Runt...
    樂樂的簡(jiǎn)書閱讀 2,135評(píng)論 0 9
  • 1 鄭巖下班回到家,一眼就看見了站在書架墻梯子上翻書的喬小雅薄嫡。 傍晚時(shí)分氧急,屋內(nèi)光線有點(diǎn)暗,喬小雅套著一條寬松的居家...
    舍梨閱讀 583評(píng)論 1 3