添加類
objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes)
添加類 superclass 類是父類 name 類的名字 size_t 類占的空間
void objc_disposeClassPair(Class cls) 銷毀類
void objc_registerClassPair(Class cls) 注冊(cè)類
objc_duplicateClass
Used by Foundation's Key-Value Observing.官方說法是不讓自己調(diào)用
Do not call this function yourself.
具體代碼:
- (void)allocClass{
Class clas = objc_allocateClassPair(NSClassFromString(@"FY"), "FYss", 0);
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t ownership = { "C", "" };
objc_property_attribute_t backingivar = { "V", "_ivar1"};
objc_property_attribute_t attrs[] = {type, ownership, backingivar};
bool success = class_addProperty(clas, "nameIvar", attrs, 3);
if (success) {
NSLog(@"addIvar success");
if (class_isMetaClass(clas)) {
NSLog(@"是一個(gè)類");
}
}
objc_registerClassPair(clas);
[self printPropreListClass:clas];
}
實(shí)例化類
// 創(chuàng)建類實(shí)例
id class_createInstance ( Class cls, size_t extraBytes );
// 在指定位置創(chuàng)建類實(shí)例
id objc_constructInstance ( Class cls, void *bytes );
// 銷毀類實(shí)例
void * objc_destructInstance ( id obj );
實(shí)例
id object_copy(id obj, size_t size) //拷貝obj
id object_dispose(id obj) //釋放obj
Ivar object_setInstanceVariable(id obj, const char *name, void *value) //修改實(shí)例的值
Ivar object_getInstanceVariable(id obj, const char *name, void **outValue) //獲取實(shí)例
OBJC_EXPORT void *object_getIndexedIvars(id obj) //獲取obj的index
id object_getIvar(id object, Ivar ivar) //獲取obj的ivar
void object_setIvar(id object, Ivar ivar, id value) //賦值ivar給obj默認(rèn)值是value
const char *object_getClassName(id obj) //獲取類的名字
Class object_getClass(id object) //獲得 類
Class object_setClass(id object, Class cls) //把obj 改到cls的類下
int objc_getClassList(Class *buffer, int bufferLen) //獲取class列表
Class *objc_copyClassList(unsigned int *outCount) //拷貝類數(shù)組
id objc_lookUpClass(const char *name) // 看看是否 注冊(cè)了類
id objc_getClass(const char *name) //獲取類
id objc_getRequiredClass(const char *name) //要是沒有這個(gè)類就kill 這個(gè)類
const char * ivar_getName( Ivar ivar) //獲取var的名字
const char * ivar_getTypeEncoding( Ivar ivar) //獲取ivar 的 type
ptrdiff_t ivar_getOffset( Ivar ivar) //
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) //給類別添加 屬性
id objc_getAssociatedObject(id object, void *key) //獲取屬性
void objc_removeAssociatedObjects(id object) //刪除屬性
發(fā)送消息
id objc_msgSend(id self, SEL op, ...)// id 發(fā)送消息給SEL op
double objc_msgSend_fpret(id self, SEL op, ...)// 和上邊的一樣這個(gè)用i386平臺(tái)摧茴,PPC和PPC64不能用赘理。
void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector, ...)// 有返回值的消息 stretAddr 是返回值 theReceiver接收消息的id SEL 是方法名
id objc_msgSendSuper(struct objc_super *super, SEL op, ...)//給父類方法發(fā)送消息
void objc_msgSendSuper_stret(struct objc_super *super, SEL op, ...)//給父類添加消息
當(dāng)我們用OC調(diào)用方法的時(shí)候翘紊,其實(shí)底層是obj發(fā)送消息的過程换薄,就夠obj發(fā)送消息給SEL鞠呈,然后objruntime中會(huì)在objSELList中尋找融师,當(dāng)然不是每次都去遍歷所有的方法的,而是在methodCache粟按,它會(huì)先去常用的方法cache在中查找诬滩,要是cache中沒有這個(gè)方法,再去遍歷所有的方法灭将。參考:Runtime源碼點(diǎn)這里
具體測(cè)試
objc_msgSend(self,@selector(msgTest));
-(void)msgTest{
NSLog(@"調(diào)用了我 objc_msgSend");
}
輸出:2016-03-23 15:06:18.011 runTimeObj[46084:3861049] 調(diào)用了我 objc_msgSend
id method_invoke(id receiver, Method m, ...) 調(diào)用receiver的方法 id 不能是nil
void method_invoke_stret(id receiver, Method m, ...) //Using this function to call the implementation of a method is faster than calling method_getImplementation and method_getName. 官方描述就是比method_getName和method_getImplementation塊
IMP method_getImplementation( Method method) //指向IMP的方法指針
IMP是什么疼鸟?本質(zhì)上是一個(gè)指針,指向方法的指針庙曙,俗名就是函數(shù)指針空镜。
const char * method_getTypeEncoding( Method method) //方法type 返回一個(gè)c字符串
char * method_copyReturnType( Method method) 方法返回的類型 一個(gè)c字符串 用完要free(char *)的
unsigned method_getNumberOfArguments( Method method) //方法的元素?cái)?shù)量
void method_getArgumentType( Method method, unsigned int index, char *dst, size_t dst_len) 獲取method 索引是index的參數(shù) 值賦給dst 要是dst = nil;系統(tǒng)自動(dòng)調(diào)用strncpy(dst, "", dst_len)
IMP method_setImplementation( Method method, IMP imp) 把imp賦給method
void method_exchangeImplementations( Method m1, Method m2) 交換兩個(gè)方法
例如:IMP imp1 = method_getImplementation(m1);
IMP imp2 = method_getImplementation(m2);
method_setImplementation(m1, imp2);
method_setImplementation(m2, imp1);
const char * * objc_copyImageNames(unsigned int *outCount)//返回所有加載的Objective-C框架和動(dòng)態(tài)庫的名字。
const char *class_getImageName(Class cls)//獲取class的動(dòng)態(tài)庫的名字
const char * *objc_copyClassNamesForImage(const char *image, unsigned int *outCount) //拷貝動(dòng)態(tài)庫
const char* sel_getName(SEL aSelector) //獲取SEL的字符串名字
SEL sel_registerName(const char *str) //注冊(cè)SEL 名字是str 返回注冊(cè)成功的SEL
SEL sel_getUid(const char *str) //獲取str的方法SEL指針
BOOL sel_isEqual(SEL lhs, SEL rhs) //判斷兩個(gè)SEL是否是同一個(gè)SEL
今天就到這吧吴攒,明天吧協(xié)議和屬性看了张抄。更多文章在www.fgyong.cn