IOS高階開發 runtime 1

2021-07-01 19:46:00 字數 2457 閱讀 2261

一、 簡介

ios 開發中靈活使用runtime 會提高我們的程式效能和開發速度。要想使用runtime,首先要引入系統的標頭檔案。

#import

當我們檢視runtime.h的時候,我們會發現,其實runtime是很有條理的

const char *object_getclassname(id obj)                     //獲取物件的類

ivar *class_copyivarlist(class cls, unsigned int *outcount) //獲取類的變數列表

unsigned method_getnumberofarguments(method m) //獲取函式變數的個數

屬性 其實就是get/set 方法。我們可以使用 objc_setassociatedobject/objc_getassociatedobject 實現 動態向類中新增 方法

objc_setassociatedobject 需要四個引數:源物件,關鍵字,關聯的物件和乙個關聯策略。

//1 源物件alert

//2 關鍵字 唯一靜態變數key associatedkey

//3 關聯的物件 sender

//4 關鍵策略 objc_association_retain_nonatomic

通過 objc_getassociatedobject獲取關聯物件

使用函式objc_removeassociatedobjects可以斷開所有關聯。通常情況下不建議使用這個函式,因為他會斷開所有關聯。只有在需要把物件恢復到「原始狀態」的時候才會使用這個函式。

二、runtime 大招

2.1)為已有的類新增屬性

oc語法允許我們通過繼承或者新增分類(category)修改(也不能說修改,就是改造成我們需要的類)已有的類。繼承在這裡不是我們想討論的,主要是想說一下分類。分類可以允許我們新增屬性(不會生成get和set方法,需要手動新增)和方法,但是卻不允許我們新增成員變數。但是有些時候,我們需要新增乙個變數來擴充這個類,比如:我有乙個類person類,帶有age 和name 屬性

#import 

@inte***ce

zzperson : nsobject  

@property

(nonatomic

,weak)

nsstring

*name;  

@property

(nonatomic

,assign)nsinteger age;  

@end

但是,後來我們發現,僅僅這兩個屬性是不夠描述的,我們還需要新增乙個job屬性來描述乙個人。因此我們想到了用分類來新增屬性。

#import 

"zzperson.h"

@inte***ce

zzperson (job)  

@property

(nonatomic

,copy

)nsstring* job;  

@end

但是事情往往沒有那麼簡單,當我們執行程式時就會發現,程式崩潰了。

- (void

)viewdidload  20

15-0

4-10

00:05

:50.591

runtime講解[41

97:2

0934

7'nsinvalidargumentexception'

,reason

: '-[dzlperson setjob:]: unrecognized selector sent to instance 0x7fe809f24790' 

程式提示我們:找不到setjob方法。這是理所當然的,因為系統不能為我們自動新增成員變數了,也就不知道該如何幫我們建立setter 和getter方法了。但是我們可以通過runtime來新增屬性,使我們能夠像真正的修改了person類那樣使用新的屬性job。

首先在分類的.m 中匯入runtime標頭檔案,然後重寫job的getter 和setter 方法。

#import 

"zzperson+job.h"

#import 

static

nsstring

*key=

@"zz"

; //利用靜態變數位址唯一不變的特性

@implementation

zzperson (job)  

-(void

)setjob:(

nsstring

*)job  

-(nsstring

*)job  

@end 

建立關聯引用,將這個物件和我們所利用的唯一不變的位址進行關聯,而關聯則是job屬性,這樣的話由於建立關聯的物件存在,所進行關聯的鍵唯一,所以我們的屬性也被唯一儲存了,如同儲存在物件自身上一樣。

IOS高階開發 Runtime(三)

11 系統類的方法實現部分替換 void methodexchange 列印結果 仔細看log 2013 07 26 16 33 22.776 highoc 7104 c07 sssaaaass 2013 07 26 16 33 22.778 highoc 7104 c07 sssaaaass 12...

IOS高階開發 Runtime(三)

11 系統類的方法實現部分替換 void methodexchange 列印結果 仔細看log 2013 07 26 16 33 22.776 highoc 7104 c07 sssaaaass 2013 07 26 16 33 22.778 highoc 7104 c07 sssaaaass 12...

IOS高階開發 Runtime(一)

一些公用類 inte ce customclass nsobject void fun1 end implementationcustomclass void fun1 end inte ce testclass nsobject end implementationtestclass end 別忘...