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 使用場景 當需要的連線數比較少的時候,單次傳送的資料量比較...