我要一次搞定runtime

2021-07-22 20:11:08 字數 3799 閱讀 8189

相關**:

1.傳送訊息

// 建立person物件

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

// 呼叫物件方法

[p eat];

// 本質:讓物件傳送訊息

objc_msgsend(p, @selector(eat));

// 呼叫類方法的方式:兩種

// 第一種通過類名呼叫

[person eat];

// 第二種通過類物件呼叫

[[person

class] eat];

// 用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫

// 本質:讓類物件傳送訊息

2.交換方法

開發使用場景:系統自帶的方法功能不夠,給系統自帶的方法擴充套件一些功能,並且保持原有的功能。

@implementation

viewcontroller

- (void)viewdidload

@end

@implementation

uiimage (image)

// 載入分類到記憶體的時候呼叫

// 只執行一次

+ (void)load

// 不能在分類中重寫系統方法imagenamed,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super.

// 既能載入又能列印

+ (instancetype)imagewithname:(nsstring *)name

return image;

}// 1.載入

// 2.判斷是否載入成功

3.動態新增方法

開發使用場景:如果乙個類方法非常多,載入類到記憶體的時候也比較耗費資源,需要給每個方法生成對映表,可以使用動態給某個類,新增方法解決。

@implementation

viewcontroller

- (void)viewdidload

@end

@implementation

person

// void(*)()

// 預設方法都有兩個隱式引數,

void eat(id

self,sel sel)

// 當乙個物件呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.

// 剛好可以用來判斷,未實現的方法是不是我們想要動態新增的方法

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}@end

4.給分類新增屬性

使用場景:給系統的類新增屬性的時候,可以使用runtime動態新增屬性方法,比如讓乙個nsobject類 儲存乙個字串

@implementation

viewcontroller

- (void)viewdidload

@end

// 定義關聯的key

static

const

char *key = "name";

@implementation

nsobject (property)

- (nsstring *)name

- (void)setname:(nsstring *)name

@end

5.字典轉模型

@implementation

nsobject (log)

// 自動列印屬性字串

+ (void)resolvedict:(nsdictionary *)dictelse

if ([obj iskindofclass:nsclassfromstring(@"__nscfarray")])else

if ([obj iskindofclass:nsclassfromstring(@"__nscfnumber")])else

if ([obj iskindofclass:nsclassfromstring(@"__nscfdictionary")])

// 屬性字串

nsstring *str;

if ([type containsstring:@"ns"]) else

// 每生成屬性字串,就自動換行。

}];// 把拼接好的字串列印出來,就好了。

nslog(@"%@",strm);

}@end

@implementation

status

+ (instancetype)statuswithdict:(nsdictionary *)dict

@end

- (void)setvalue:(id)value forundefinedkey:(nsstring *)key

@implementation

viewcontroller

- (void)viewdidload

// 測試資料

nslog(@"%@ %@",_statuses,[_statuses[0] user]);

}@end

@implementation

nsobject (model)

+ (instancetype)modelwithdict:(nsdictionary *)dict

; // 用乙個ivar *指標指向陣列第乙個元素

ivar *ivarlist = a;

// 根據指標訪問陣列第乙個元素

ivarlist[0];

*/unsigned

int count;

// 獲取類中的所有成員屬性

ivar *ivarlist = class_copyivarlist(self, &count);

for (int i = 0; i < count; i++)

}// **轉換:nsarray中也是字典,把陣列中的字典轉換成模型.

// 判斷值是否是陣列

if ([value iskindofclass:[nsarray class]])

// 把模型陣列賦值給value

value = arrm;}}

if (value)

}return objc;

}@end

我要試一次

剛看了 蘆葦的思考 http crazelionking.blogdriver.com crazelionking index.html 裡的 行動起來吧 翻出劉韌的 我要試一次 我忘記和缺少的東西越來越多,有激情有夢想.貼出 我要試一次 我要試一次 劉韌我在18歲的時候,愛上乙個姑娘,她是我高中的...

左旋右旋問題一次搞定!!!

題目要求 實現乙個函式,可以左 右旋字串中的k個字元。abcd左旋乙個字元得到bcda abcd左旋兩個字元得到cdab aabcd右旋乙個字元得到daabc include void menu void leftslue char arr,int sz arr sz 1 tmp void righ...

LINUX搭建gitlab(一次搞定)

1,安裝gitlab 一 安裝環境 1 centos 6或者7 此處使用7 2 2g記憶體 實驗 生產 至少4g 不然會很卡 3 安裝包 gitlab ce 10.2.2 ce 4 禁用防火牆,關閉selinux 後期開啟自己調防火牆許可權 二 安裝軟體 1 安裝依賴 root 根目錄 yum in...