讓你快速上手Runtime

2021-07-28 02:29:54 字數 3076 閱讀 2242

1.傳送訊息

// 建立person物件

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

// 呼叫物件方法

[p eat];

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

objc_msgsend(p, @selector(eat));

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

// 第一種通過類名呼叫

[person eat];

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

[[person class] eat];

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

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

objc_msgsend([person class], @selector

(eat));

2.交換方法
@implementation

viewcontroller

- (void)viewdidload

@end

@implementation

uiimage (image)

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

+ (void)load

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

// 既能載入又能列印

+ (instancetype)imagewithname:(nsstring *)name

return image;

}@end

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.給分類新增屬性
@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

讓你快速上手Runtime

1.傳送訊息 建立person物件 person p person alloc init 呼叫物件方法 p eat 本質 讓物件傳送訊息 objc msgsend p,selector eat 呼叫類方法的方式 兩種 第一種通過類名呼叫 person eat 第二種通過類物件呼叫 person cl...

快速上手Runtime(四)之動態新增方法

如果乙個類方法非常多,載入類到記憶體的時候也比較耗費資源,可以使用動態給某個類,新增方法解決。做到優化記憶體,節省資源的效果。resolveinstancemethod created by doman on 17 3 23.import person.h import implementation...

快速讓你區分BIO NIO AIO

bio 同步並阻塞,伺服器實現模式為乙個連線乙個執行緒,即客戶端有連線請求時伺服器端就需要啟動乙個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善 可以參閱bio.png 和偽非同步io.png 使用場景 當需要的連線數比較少的時候,單次傳送的資料量比較...