iOS runtime執行時詳解

2021-10-07 13:34:48 字數 3377 閱讀 9492

記錄一下之前的學習內容

viewcontroller.m中

//棧 是高位址往低走 堆是低位址往高走 ,

//(堆疊溢位 堆和棧 被分配到記憶體區域的兩邊 分別往中間儲存,存滿碰頭就會溢位)

//這是乙個方法: oc方法的本質 c函式 == 函式呼叫棧

- (void)viewdidload

[self viewdidload];//會導致程式崩潰 ,記憶體不夠

person * p = [[person alloc]init];

[p eat];

[p eatwithobjc:@"hanbao"];

objc_msgsend(p, @selector(eatwithobjc:),@"hanbao"); //這句等於[p eatwithobjc:@"hanbao"];

}

oc方法由哪幾個部分組成:

sel:方法編號; 類似目錄的名稱

imp(implementation)方法實現 是指標(函式指標) 類似目錄省略號後的頁碼 頁碼指向的內容就是指標指向的位址

oc的方法呼叫其實是 訊息傳送

oc的方法呼叫其實是 呼叫c的函式

person.h

@inte***ce person : nsobject

- (void)eat;

- (void)eatwithobjc:(nsstring *)objc;

@end

#import "person.h"

#import @implementation person

//-(void)eat

//+ (bool)resolveinstancemethod:(sel)sel

//乙個函式

//void eat()

//有引數時

//前面兩個是隱式引數

//oc方法呼叫會傳遞兩個隱式引數

void eat(id self,sel _cmd,nsstring * objc)

@end

2.nil nil null 和nsnull 的區別

雖然工作上除了nil,其它的幾乎少有用到,

一、nil

我們給物件賦值時一般會使用object = nil,表示我想把這個物件釋放掉;

或者物件由於某種原因,經過多次release,於是物件引用計數器為0了,系統將這塊記憶體釋放掉,這個時候這個物件為nil,我稱它為「空物件」。

二、nsnull

nsnull和nil的區別在於,nil是乙個空物件,已經完全從記憶體中消失了,而如果我們想表達「我們需要有這樣乙個容器,但這個容器裡什麼也沒有」的觀念時,我們就用到nsnull,我稱它為「值為空的物件」。如果你查閱開發文件你會發現nsnull這個類是繼承nsobject,並且只有乙個「+ (nsnull *) null;」類方法。這就說明nsnull物件擁有乙個有效的記憶體位址,所以在程式中對它的任何引用都是不會導致程式崩潰的。

三、nil

nil和nil在使用上是沒有嚴格限定的,也就是說凡是使用nil的地方都可以用nil來代替,反之亦然。只不過從程式設計人員的規約中我們約定俗成地將nil表示乙個空物件,nil表示乙個空類。參考**如下:

四、null

我們知道object-c**於c、支援於c,當然也有別於c。而null就是典型c語言的語法,它表示乙個空指標,參考**如下:

int *ponit = null;

runtime詳解

舉例runtime的乙個應用 鏈結裡也有

viewcontroller.m

#import "viewcontroller.h"

#import "nsurl+hook.h"

#import "person.h"

@inte***ce viewcontroller (

)@property

(nonatomic,strong)person *p;

@end

@implementation viewcontroller-(

void

)viewdidload -(

void

)observevalueforkeypath:

(nsstring *

)keypath ofobject:

(id)object change:

(nsdictionary

*)change context:

(void

*)context-(

void

)touchesbegan:

(nsset>

*)touches withevent:

(uievent *

)event

@end

person.h

@inte***ce person : nsobject

//屬性 = 成員變數 + setter + getter 方法

@property

(nonatomic,copy)nsstring *name;

@end

nskvonotyfing_person.m 繼承自person

#import "nskvonotyfing_person.h"

@implementation nskvonotyfing_person-(

void

)setname:

(nsstring *

)name

@end

nsurl+hook

category

#import "nsurl+hook.h"

#import

@implementation nsurl (hook)

//urlstring裡帶中文的時候 返回的url為空 但oc沒判斷

//第一種處理方式

//+ (instancetype)hk_urlwithstring:(nsstring *)urlstring

//// return url;

//}//第二種:利用runtime 改變方法呼叫的順序!(d方法欺騙)+(

void

)load);

}//在 objective-c 的執行時中,每個類有兩個方法都會自動呼叫。+load 是在乙個類被初始裝載時呼叫,+initialize 是在應用第一次呼叫該類的類方法或例項方法前呼叫的。兩個方法都是可選的,並且只有在方法被實現的情況下才會被呼叫。

+(instancetype)hk_urlwithstring:

(nsstring *

)urlstring

return url;

}

iOS runtime 執行時 二 深談

attention!逆天的來了 我們在程式設計過程中,如果使用到了runtime 執行時 我們幾乎都是想動態的改變這個類的資訊,包括方法,屬性,balabala的,並且獲得這個類的一些資訊,等等,下面我們就來看看怎麼通過runtime提供的方法,來達到這些目的 1 獲取 這個類的所有屬性 h 檔案 ...

iOS runtime 執行時 三 深談

引入 import nsobject object nsobject alloc init nsstring str runtime新增的變數 新增 屬性 objc setassociatedobject object,fyobjprokey,str,objc association copy 獲取...

ios Runtime 執行時機制

1.runtime 叫做執行時機制,其實oc也有執行時機制 訊息機制!我們oc中呼叫方法的時候,其實底層就是發訊息。2.c語言中,函式的呼叫在編譯的時候會決定呼叫哪個函式。3.oc當中的函式,屬於動態呼叫的過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在執行的時候才會決定呼叫函式。那麼,現在就可...