iOS runtime 執行時 三 深談

2021-07-10 12:31:38 字數 1884 閱讀 4512

引入 #import

nsobject *object = [[nsobject alloc] init];

nsstring *str = @"runtime新增的變數";

// 新增 屬性

objc_setassociatedobject(object, &fyobjprokey, str, objc_association_copy);

// 獲取 屬性

id objvalue = objc_getassociatedobject(object, &fyobjprokey);

nsstring *getstr = (nsstring *)objvalue;

nslog(@"%@",getstr);

系統類 nsobject,通過 objc_getassociatedobject 這個方法,繫結了乙個新的變數,通過objc_getassociatedobject 這個方法得到 新繫結的變數,稍後再細講這兩個方法,核心就是繫結了乙個變數,通過這個模式我們來把我們一開始的目的實現

下面我們 新建乙個nsobject的類別

#import 

@inte***ce

nsobject (fyaddtions)

@property(nonatomic,copy)nsstring *hotelname;

@end

#import "nsobject+fyaddtions.h"

#import

static

void* fyobjprokey = @"fyobjprokey";

@implementation

nsobject (fyaddtions)

-(void)sethotelname:(nsstring *)hotelname

-(nsstring *)hotelname

@end

由於系統類,是不可變的,通過這個方法,就可以變相的給nsobject 新增了乙個屬性

下面我們來嘗試一下:

在新的類裡,引入標頭檔案

nsobject *object = [[nsobject

alloc] init];

object.hotelname = @"哈哈哈";

nslog(@"%@",object.hotelname);

好了目的實現了,下面說說 這兩個方法

1.objc_setassociatedobject(self, &fyobjprokey, hotelname, objc_association_copy);

self 是要給哪個物件新增 變數

&fyobjprokey 是對這個變數的標記,獲得這個變數也是需要這個key值得

hotelname 是 這個 變數的值

objc_association_copy 這個 是新增變數的策略,和屬性的copy類似

一共有 5 個策略

objc_association_assign; //assign策略

objc_association_copy_nonatomic; //copy,nonatomic策略

objc_association_retain_nonatomic; // retain,nonatomic策略

objc_association_retain //retain策略

objc_association_copy //copy策略

2.objc_getassociatedobject(self, &fyobjprokey)

通過 &fyobjprokey 這個標記 獲得 新新增的變數

iOS runtime執行時詳解

記錄一下之前的學習內容 viewcontroller.m中 棧 是高位址往低走 堆是低位址往高走 堆疊溢位 堆和棧 被分配到記憶體區域的兩邊 分別往中間儲存,存滿碰頭就會溢位 這是乙個方法 oc方法的本質 c函式 函式呼叫棧 void viewdidload self viewdidload 會導致...

iOS runtime 執行時 二 深談

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

ios Runtime 執行時機制

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