https://blog.csdn.net/wywinstonwy/article/details/124397283
Runtime介紹
Working with Classes(操 作類)
class_getName(獲取類的名稱)
class_getSuperclass(獲取父類)
class_isMetaClass(判斷類是否是元類)
class_getInstanceSize(獲取 類的實例大小)
class_getInstanceVariable(獲取類中指定的實例變量的信息的數(shù)據(jù)結(jié)構(gòu)的指針)
class_getClassVariable(獲取類中指定的類變量的信息的數(shù)據(jù)結(jié)構(gòu)的指針)
class_addIvar(向類添加新的實例變量)
class_copyIvarList(獲取類的實例變量列表)
class_getIvarLayout(獲取類的布局描述)
class_setIvarLayout(設(shè)置類的 實例變量的修飾符)
class_getWeakIvarLayout(獲取 類的weak修飾的實例變量)
class_setWeakIvarLayout(設(shè)置類的實例變量的修飾符為weak)
class_getProperty(獲取指定的屬性)
class_copyPropertyList(獲取整個屬性列表)
class_addMethod(給類添加方法)
class_getInstanceMethod(獲取類的實例方法)
class_getClassMethod(獲取類方法)
class_copyMethodList(獲取整個類的實例方法)
class_replaceMethod(交換方法)
class_getMethodImplementation(獲取方法實現(xiàn))
class_respondsToSelector(判斷是否響應(yīng)方法)
class_addProtocol(向類添加協(xié)議)
class_addProperty(為類添加屬性)
class_replaceProperty(替換類的屬性)
class_conformsToProtocol(判斷是否遵循某個協(xié)議)
class_copyProtocolList(獲取協(xié)議列表)
class_getVersion( 獲取類的版本號)
Adding Classes(添加類)
objc_allocateClassPair(添加一 個新類)
objc_disposeClassPair(銷毀一個類)
objc_registerClassPair(注冊使用類)
Instantiating Classes(實例化類)
class_createInstance(類實例化)
Working with Libraries(使用 庫)
objc_copyImageNames(獲取所 有objc的框架和動態(tài)庫)
class_getImageName(獲取類源自的動態(tài)庫的名稱)
objc_copyClassNamesForImage(獲取指定庫或框架中的所有類 的名稱)
Working with Selectors(使用選 擇器)
sel_getName(獲取方法的名稱)
sel_registerName(注冊方法)
sel_isEqual(判斷倆個選擇器是否相等)
Working with Protocols(使用協(xié) 議)
objc_getProtocol(獲取指定的協(xié)議)
objc_copyProtocolList(獲取所 有的協(xié)議列表)
objc_allocateProtocol(創(chuàng)建協(xié)議)
Working with Instances(使用實例)
object_getIvar(獲取對象中實例 變量的值)
object_setIvar(設(shè)置對象中實例 變量的值)
object_getClassName(獲取對象的類名)
object_getClass(獲取對象的類 對象)
object_setClass(設(shè)置對象的 類)
Obtaining Class Definitions(獲 取類定義)
objc_getClassList(獲取已注冊 的類的數(shù)量)
objc_copyClassList(獲取所有 已注冊的類)
objc_lookUpClass(獲取指定的類定義)
objc_getClass(獲取指定的類定 義)
objc_getRequiredClass(獲取指 定的類定義)
objc_getMetaClass(獲取指定 的類的元類定義)
Working with Instance Variables(使用實例變量)
ivar_getName(獲取實例變量名稱)
ivar_getTypeEncoding(獲取實 例變量的類型)
ivar_getOffset(獲取實例變量的偏移量)
Associative References(關(guān)聯(lián)引用)
objc_setAssociatedObject(設(shè) 置關(guān)聯(lián))
objc_getAssociatedObject(獲 取關(guān)聯(lián)的值)
objc_removeAssociatedObjects(刪除關(guān)聯(lián))
Sending Messages(發(fā)送消息)
objc_msgSend:向類的實例發(fā)送帶有簡單返回值的消息
objc_msgSend_fpret:將帶有浮點返回值的消息發(fā)送到類的實例
objc_msgSend_stret: 將帶有數(shù)據(jù)結(jié)構(gòu)返回值的消息發(fā)送到類的實例
objc_msgSendSuper:將帶有簡單返回值的消息發(fā)送到類實例的超類
objc_msgSendSuper_stret:將帶有數(shù)據(jù)結(jié)構(gòu)返回值的消息發(fā)送到類實例的超類
Working with Properties(使用屬性)
property_getName(獲取屬性的名稱)
property_getAttributes(獲取屬 性的屬性)
property_copyAttributeValue(獲取屬性的指定屬性的值)
property_copyAttributeList(獲 取屬性的屬性列表)
Using Objective-C Language Features(使用OC語言特性)
objc_enumerationMutation(檢測到突變時,編譯器將插入次函數(shù) 并且調(diào)用
objc_setEnumerationMutationHandler(設(shè)置突變處理函數(shù))
Working with Methods(使用方法)
method_invoke:方法調(diào)用
method_invoke_stret:調(diào)用返回值為結(jié)構(gòu)體的方法
method_getName(獲取方法的名稱)
method_getImplementation(獲 取方法的實現(xiàn))
method_copyReturnType(獲取 方法的返回值類型)
Runtime介紹
Objective-C 擴展了 C 語言丙笋,并加入了面向?qū)ο筇匦院?Smalltalk 式的消息傳遞機制绷杜。而這個擴展的核心是一個用 C 和 編譯語言 寫的 Runtime 庫冶伞。它是 Objective-C 面向?qū)ο蠛蛣討B(tài)機制的基石芜壁。
Objective-C 是一個動態(tài)語言落追,這意味著它不僅需要一個編譯器叠赐,也需要一個運行時系統(tǒng)來動態(tài)得創(chuàng)建類和對象、進行消息傳遞和轉(zhuǎn)發(fā)五鲫。理解 Objective-C 的 Runtime 機制可以幫我們更好的了解這個語言溺职,適當(dāng)?shù)臅r候還能對語言進行擴展,從系統(tǒng)層面解決項目中的一些設(shè)計或技術(shù)問題位喂。了解 Runtime 浪耘,要先了解它的核心 - 消息傳遞 (Messaging)。
Runtime其實有兩個版本: “modern” 和 “l(fā)egacy”塑崖。我們現(xiàn)在用的 Objective-C 2.0 采用的是現(xiàn)行 (Modern) 版的 Runtime 系統(tǒng)七冲,只能運行在 iOS 和 macOS 10.5 之后的 64 位程序中。而 macOS 較老的32位程序仍采用 Objective-C 1 中的(早期)Legacy 版本的 Runtime 系統(tǒng)规婆。這兩個版本最大的區(qū)別在于當(dāng)你更改一個類的實例變量的布局時澜躺,在早期版本中你需要重新編譯它的子類,而現(xiàn)行版就不需要抒蚜。
Runtime 基本是用 C 和匯編寫的掘鄙,可見蘋果為了動態(tài)系統(tǒng)的高效而作出的努力。你可以在這里下到蘋果維護的開源代碼削锰。蘋果和GNU各自維護一個開源的 runtime 版本通铲,這兩個版本之間都在努力的保持一
平時的業(yè)務(wù)中主要是使用官方Api,解決我們框架性的需求器贩。
高級編程語言想要成為可執(zhí)行文件需要先編譯為匯編語言再匯編為機器語言,機器語言也是計算機能夠識別的唯一語言朋截,但是OC并不能直接編譯為匯編語言蛹稍,而是要先轉(zhuǎn)寫為純C語言再進行編譯和匯編的操作,從OC到C語言的過渡就是由runtime來實現(xiàn)的部服。然而我們使用OC進行面向?qū)ο箝_發(fā)唆姐,而C語言更多的是面向過程開發(fā),這就需要將面向?qū)ο蟮念愞D(zhuǎn)變?yōu)槊嫦蜻^程的結(jié)構(gòu)體廓八。具體累得結(jié)構(gòu)可以參見上一篇 iOS類的本質(zhì)探索_風(fēng)雨「83」的博客-CSDN博客 奉芦,本篇主要看一下常用的runtime接口赵抢。
Working with Classes(操 作類)
class_getName(獲取類的名稱)
//參數(shù):類Class //返回:char
const char *className=class_getName([myclass class]);
NSLog(@"lg_class_getName:%s",className);
class_getSuperclass(獲取父類)
//參數(shù):類Class //返回:父類Class
Class result = class_getSuperclass([myclass class]);
NSLog(@"lg_class_getName:%@",result);
class_isMetaClass(判斷類是否是元類)
//參數(shù):類Class //返回:BOOL類型
BOOL isMetaClass = class_isMetaClass([myclass class]);
NSLog(@"lg_class_isMetaClass:%d",isMetaClass);
class_getInstanceSize(獲取 類的實例大小)
//參數(shù):類Class
//返回:類的實例大小
size_t resultSize = class_getInstanceSize([myclass class]);
NSLog(@"lg_class_getInstanceSize:%zu",resultSize);
class_getInstanceVariable(獲取類中指定的實例變量的信息的數(shù)據(jù)結(jié)構(gòu)的指針)
//參數(shù):類Class 實例變量的名稱 //返回:Ivar指針
const char *result1 = [@"_name" UTF8String];
Ivar result2 = class_getInstanceVariable([myclass class], result1);
NSLog(@"lg_class_getInstanceVariable:%p",result2);
class_getClassVariable(獲取類中指定的類變量的信息的數(shù)據(jù)結(jié)構(gòu)的指針)
//參數(shù):1.類Class 2.類變量名稱 //返回:指定的類變量的信息的數(shù)據(jù)結(jié)構(gòu)的指針
Ivar ivar = class_getClassVariable(myclass, [@"isa" UTF8String]);
NSLog(@"lg_class_getClassVariable:%p",ivar);
class_addIvar(向類添加新的實例變量)
Class CreatClass0 = objc_allocateClassPair([NSObject class], "CreatClass0", 0);
class_addIvar(CreatClass0, "_attribute0", sizeof(NSString *), log(sizeof(NSString *)), "i");
Ivar ivar1 = class_getInstanceVariable(CreatClass0, "_attribute0");
NSLog(@"class_addIvar:%@",[NSString stringWithUTF8String:ivar_getName(ivar1)]);
class_copyIvarList(獲取類的實例變量列表)
//入?yún)?1、類Class 2声功、unsigned int類型
//返回:Ivar 類型的指針數(shù)組
unsigned int copyIvarListCount = 0;
Ivar *ivars = class_copyIvarList([myclass class], ©IvarListCount);
for (NSInteger i = 0; i< copyIvarListCount; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSLog(@"lg_class_copyIvarList:%s",name);
}
free(ivars);//釋放
class_getIvarLayout(獲取類的布局描述)
//class_getIvarLayout(獲取類 的布局描述)
//lei class
//返回:返回值是指向 uint8_t 的指針
const uint8_t *resultvar = class_getIvarLayout([myclass class]);
NSLog(@"lg_class_getIvarLayout:%p",resultvar);
class_setIvarLayout(設(shè)置類的 實例變量的修飾符)
//
uint8_t u = 1;
const uint8_t *u8 = &u;
//參數(shù):1.類Class 2.const uint8_t *
class_setIvarLayout([myclass class], u8);
class_getWeakIvarLayout(獲取 類的weak修飾的實例變量)
//參數(shù):類Class //返回:返回值是指向 uint8_t 的指針
const uint8_t *resultWeakIvar = class_getWeakIvarLayout([myclass class]);
NSLog(@"lg_class_getIvarLayout:%p",resultWeakIvar);
class_setWeakIvarLayout(設(shè)置類的實例變量的修飾符為weak)
uint8_t u1 = 1;
const uint8_t *u8t = &u1;
//參數(shù):1.類Class 2.const uint8_t *
class_setWeakIvarLayout([myclass class], u8t);
class_getProperty(獲取指定的屬性)
//參數(shù):1.類Class 2.屬性名 //返回:屬性objc_property_t
objc_property_t resultProperty = class_getProperty([myclass class], [@"name" UTF8String]);
NSLog(@"lg_class_getProperty:%p",resultProperty);
class_copyPropertyList(獲取整個屬性列表)
//參數(shù):1.類Class 2.unsigned int類型
//返回:屬性列表
unsigned int copyPropertyListCount = 0;
objc_property_t *propertys = class_copyPropertyList([myclass class], ©PropertyListCount);
for (NSInteger i = 0; i < copyPropertyListCount; i++)
{
objc_property_t property = propertys[i];
const char *name = property_getName(property);
NSLog(@"lg_class_copyPropertyList:%s",name);
}
free(propertys);//釋放
class_addMethod(給類添加方法)
//參數(shù):1.類Class 2.方法名 3.imp,函數(shù)實現(xiàn) 4.方法參數(shù)類型描述 //返回值:BOOL
BOOL resultaddMethod = class_addMethod([myclass class], NSSelectorFromString(@"lgMethod"), [self methodForSelector:@selector(lg_method)], "@@:");
NSLog(@"lg_addMethod:%d",resultaddMethod);
class_getInstanceMethod(獲取類的實例方法)
//參數(shù):1.類Class 2.方法名SEL
//返回:method結(jié)構(gòu)體指針
Method resultInstanceMethod = class_getInstanceMethod([myclass class],
@selector(lg_method));
NSLog(@"lg_class_getInstanceMethod:%p",resultInstanceMethod);
class_getClassMethod(獲取類方法)
//入?yún)?1.類Class 2.方法名SEL //返回:method結(jié)構(gòu)體指針
Method resultclassMethod = class_getClassMethod([myclass class], @selector(lgClassMethod));
NSLog(@"lg_class_getClassMethod:%p",resultclassMethod);
class_copyMethodList(獲取整個類的實例方法)
//參數(shù):1烦却、類Class 2、unsigned int 類型
//返回:整個類的實例方法
unsigned int copycopyMethodListCount = 0;
Method *methods = class_copyMethodList([myclass class], ©copyMethodListCount);
for (NSInteger i = 0; i < copycopyMethodListCount; i++) {
Method method = methods[i];
SEL name = method_getName(method);
NSLog(@"lg_class_copyMethodList:%@",NSStringFromSelector(name));
}
free(methods);//釋放
class_replaceMethod(交換方法)
[self lg_method1];
//參數(shù):1.類Class 2.方法名SEL 3.方法的實現(xiàn)IMP 4.方法參數(shù)描述
//返回:BOOL
BOOL resultreplace = class_replaceMethod([self class], @selector(lg_method1), [self
methodForSelector:@selector(lg_method2)], NULL);
NSLog(@"lg_class_replaceMethod:%d",resultreplace);
[self lg_method1];
class_getMethodImplementation(獲取方法實現(xiàn))
//參數(shù):1.類Class 2.方法名SEL //返回:方法實現(xiàn)IMP
IMP resultMethodImplementation = class_getMethodImplementation([self class], @selector(lg_method));
resultMethodImplementation();
class_respondsToSelector(判斷是否響應(yīng)方法)
//參數(shù):1.類Class 2.方法名SEL //返回:BOOL
BOOL respondsToSelector = class_respondsToSelector(self.class, @selector(viewDidLoad));
NSLog(@"lg_class_respondsToSelector:%d",respondsToSelector);
class_addProtocol(向類添加協(xié)議)
//參數(shù):1.類Class 2.協(xié)議
//返回:BOOL
BOOL resultaddProtocol = class_addProtocol([myclass class],
NSProtocolFromString(@"UITableViewDelegate"));
NSLog(@"lg_class_addProtocol:%d",resultaddProtocol);
class_addProperty(為類添加屬性)
objc_property_attribute_t ownership = { "C", "" }; // C = copy
objc_property_attribute_t backingivar = { "V", "_attribute0" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
//參數(shù):1.類Class 2.屬性數(shù)組 3.屬性個數(shù)
//返回值:BOOL
BOOL suc0 = class_addProperty(self.class, "_attribute0", attrs, 3);
SEL getter = NSSelectorFromString(@"attribute0");
SEL setter = NSSelectorFromString(@"setAttribute0:");
BOOL suc1 = class_addMethod(self.class, getter, (IMP)attribute0Getter, "@@:");
BOOL suc2 = class_addMethod(self.class, setter, (IMP)attribute0Setter, "v@:@"); NSLog(@"lg_class_addProperty:class_addProperty = %d,class_addMethod_Getter =
%d,class_addMethod_Setter = %d",suc0,suc1,suc2);
class_replaceProperty(替換類的屬性)
objc_property_attribute_t type = { "T", "@"NSString"" };
objc_property_attribute_t ownership = { "C", "" }; // C = copy
objc_property_attribute_t backingivar = { "V", "_attribute0" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
//參數(shù):1.類Class 2.屬性名稱 3.屬性的相關(guān)屬性 4.屬性的相關(guān)屬性的個數(shù)
class_replaceProperty(self.class, [@"logic" UTF8String], attrs, 3);
class_conformsToProtocol(判斷是否遵循某個協(xié)議)
//參數(shù):1.類Class 2.協(xié)議 //返回:BOOL
BOOL conformsToProtocol = class_conformsToProtocol([self class], NSProtocolFromString(@"UITableViewDelegate"));
NSLog(@"lg_class_conformsToProtocol:%d",conformsToProtocol);
class_copyProtocolList(獲取協(xié)議列表)
//入?yún)?1先巴、類Class 2其爵、unsigned int 類型
//返回:整個類的遵循的協(xié)議
unsigned int copyProtocolListCount = 0;
Protocol * __unsafe_unretained *protocals = class_copyProtocolList([myclass class], ©ProtocolListCount);
for (NSInteger i = 0; i < copyProtocolListCount; i++) {
Protocol * protocal = protocals[i];
const char *name = protocol_getName(protocal);
NSLog(@"lg_class_copyProtocolList:%s",name);
}
free(protocals);//釋放
class_getVersion( 獲取類的版本號)
//參數(shù):類Class //返回:版本號
int resultVersion = class_getVersion([myclass class]);
NSLog(@"lg_class_getVersion:%d",resultVersion);
Adding Classes(添加類)
objc_allocateClassPair(添加一 個新類)
//參數(shù):1.新添加類的父類 2.新類的名稱 3.填0 //返回:新類
Class resultallocateClassPair = objc_allocateClassPair([NSObject class], [@"NewClass" UTF8String], 0);
NSLog(@"lg_objc_allocateClassPair:%p",resultallocateClassPair);
objc_disposeClassPair(銷毀一個類)
//參數(shù):類Class
objc_disposeClassPair(result);
objc_registerClassPair(注冊使用類)
Class result = objc_allocateClassPair([NSObject class], [@"NewClass" UTF8String], 0);
//參數(shù):類Class
objc_registerClassPair(result);
Instantiating Classes(實例化類)
class_createInstance(類實例化)
//參數(shù):1.類Class 2.額外分配的字節(jié)數(shù)
//返回:類的實例
NSObject *result4 = class_createInstance([NSObject
class], 0);
NSLog(@"lg_class_createInstance:%@",result4);
Working with Libraries(使用 庫)
objc_copyImageNames(獲取所 有objc的框架和動態(tài)庫)
unsigned int a = 0;
//參數(shù):unsigned int * //返回:C字符串?dāng)?shù)組
const char **result5 = objc_copyImageNames(&a);
for (int i = 0; i < a; i ++) {
const char *c = result5[i];
NSLog(@"lg_objc_copyImageNames:%@\n\n",[NSString stringWithUTF8String:c]);
}
class_getImageName(獲取類源自的動態(tài)庫的名稱)
//參數(shù):類Class //返回:源自的動態(tài)庫的名稱
const char *result6 = class_getImageName([myclass class]);
NSLog(@"lg_class_getImageName:%@",[NSString stringWithUTF8String:result6]);
objc_copyClassNamesForImage(獲取指定庫或框架中的所有類 的名稱)
unsigned int outCount = 0;
Dl_info info;
dladdr(&_mh_execute_header, &info);
//參數(shù):1.庫或者框架 2.unsigned int * //返回:指定庫或框架中的所有類的名稱
const char **result7 = objc_copyClassNamesForImage(info.dli_fname, &outCount);
for (int i = 0; i < outCount; i ++) {
const char *c = result7[i];
NSLog(@"lg_objc_copyClassNamesForImage:%@",[NSString stringWithUTF8String:c]);
}
Working with Selectors(使用選 擇器)
sel_getName(獲取方法的名稱)
SEL sel = NSSelectorFromString(@"lg_method");
//參數(shù):SEL //返回:方法的名稱
const char *result7 = sel_getName(sel);
NSLog(@"lg_sel_getName:%@",[NSString stringWithUTF8String:result7]);
sel_registerName(注冊方法)
//參數(shù):const char * //返回:SEL
SEL result = sel_registerName([@"lglglg" UTF8String]);
NSLog(@"lg_sel_registerName:%p",result);
sel_isEqual(判斷倆個選擇器是否相等)
SEL sel1 = NSSelectorFromString(@"lg_method1");
SEL sel2 = NSSelectorFromString(@"lg_method2");
//參數(shù):SEL //返回:BOOL
BOOL result8 = sel_isEqual(sel1, sel2);
NSLog(@"lg_sel_isEqual:%d",result8);
Working with Protocols(使用協(xié) 議)
objc_getProtocol(獲取指定的協(xié)議)
//參數(shù):協(xié)議名稱 //返回:協(xié)議
Protocol *result9 = objc_getProtocol([@"UITableViewDelegate" UTF8String]);
NSLog(@"lg_objc_getProtocol:%@",result9);
objc_copyProtocolList(獲取所 有的協(xié)議列表)
unsigned int count = 0;
//參數(shù):unsigned int * //返回:所有的協(xié)議列表
Protocol __unsafe_unretained **result10 = objc_copyProtocolList(&count);
for (int i = 0; i < count; i ++) {
Protocol *pro = result10[i];
NSLog(@"lg_objc_copyProtocolList:%@",pro);
}
objc_allocateProtocol(創(chuàng)建協(xié)議)
//參數(shù):協(xié)議的名稱
//返回:協(xié)議
Protocol *result = objc_allocateProtocol([@"LGProtocol"
UTF8String]);
NSLog(@"lg_objc_allocateProtocol:%@",result);
。伸蚯。摩渺。
Working with Instances(使用實例)
object_getIvar(獲取對象中實例 變量的值)
Ivar ivarVariable = class_getInstanceVariable([self class],[@"_name" UTF8String]); //參數(shù):1.對象obj 2.實例變量ivar
//返回:id
NSString *result12 = object_getIvar(self, ivarVariable);
NSLog(@"lg_object_getIvar:%@",result12);
object_setIvar(設(shè)置對象中實例 變量的值)
Ivar ivarInstanceVariable = class_getInstanceVariable(self.class, [@"_name" UTF8String]);
//參數(shù):1.對象obj 2.實例變量ivar 3.實例變量的值id
object_setIvar(self, ivarInstanceVariable, @"123456");
object_getClassName(獲取對象的類名)
//參數(shù):對象obj //返回:對象的類名
const char*resultClassName = object_getClassName(self);
NSLog(@"lg_object_getClassName:%@",[NSString stringWithUTF8String:resultClassName]);
object_getClass(獲取對象的類 對象)
//參數(shù):對象obj //返回:類Class
Class resultgetClass = object_getClass(self);
NSLog(@"lg_object_getClass:%@",resultgetClass);
object_setClass(設(shè)置對象的 類)
//參數(shù):1.對象obj 2.類Class //返回:類Class
Class resultsetClass = object_setClass(self, [myclass class]);
NSLog(@"lg_object_setClass:%@",resultsetClass);
Obtaining Class Definitions(獲 取類定義)
objc_getClassList(獲取已注冊 的類的數(shù)量)
//參數(shù):1.傳NUll獲取當(dāng)前注冊的所有類 2.傳0 //返回:所有注冊類的總數(shù)
int resultClassList = objc_getClassList(NULL, 0);
NSLog(@"lg_objc_getClassList:%d",resultClassList);
objc_copyClassList(獲取所有 已注冊的類)
unsigned int outCount; //參數(shù):整數(shù)指針
//返回:已注冊的類的指針列表
Class *resultcopyClassList = objc_copyClassList(&outCount);
for (int i = 0; i < outCount; i++) {
NSLog(@"lg_objc_copyClassList:%s",class_getName(resultcopyClassList[i]));
}
free(resultcopyClassList);
objc_lookUpClass(獲取指定的類定義)
//參數(shù):類的名稱 //返回:類Class
Class resultlookUpClass = objc_lookUpClass([@"FitstViewController" UTF8String]);
NSLog(@"lg_objc_lookUpClass:%@",resultlookUpClass);
objc_getClass(獲取指定的類定 義)
//參數(shù):類的名稱
//返回:類Class
Class resultgetClass1 = objc_getClass([@"FitstViewController"
UTF8String]);
NSLog(@"objc_getClass:%@",resultgetClass1);
objc_getRequiredClass(獲取指 定的類定義)
//參數(shù):類的名稱 //返回:類Class
Class resultRequiredClass = objc_getRequiredClass([@"FitstViewController" UTF8String]);
NSLog(@"lg_objc_getRequiredClass:%@",resultRequiredClass);
objc_getMetaClass(獲取指定 的類的元類定義)
//參數(shù):類的名稱
//返回:類 Class
id resultMetaClass = objc_getMetaClass([@"FitstViewController" UTF8String]);
NSLog(@"objc_getMetaClass:%@",resultMetaClass);
Working with Instance Variables(使用實例變量)
ivar_getName(獲取實例變量名稱)
Ivar ivarIV = class_getInstanceVariable([myclass class], [@"_name" UTF8String]);
//參數(shù):Ivar //返回:實例變量的名稱
const char resultName = ivar_getName(ivarIV);
NSLog(@"lg_ivar_getName:%@",[NSString stringWithUTF8String:resultName]);
ivar_getTypeEncoding(獲取實 例變量的類型)
Ivar ivar2 = class_getInstanceVariable(self.class, [@"_name" UTF8String]);
//參數(shù):Ivar
//返回:實例變量的類型
const char resultypeEncoding = ivar_getTypeEncoding(ivar2);
NSLog(@"lg_ivar_getTypeEncoding:%@",[NSString
stringWithUTF8String:resultypeEncoding]);
ivar_getOffset(獲取實例變量的偏移量)
Ivar ivar3 = class_getInstanceVariable(self.class, [@"_name" UTF8String]); //參數(shù):Ivar
//返回:實例變量的類型
ptrdiff_t resultOffset = ivar_getOffset(ivar3);
NSLog(@"lg_ivar_getOffset:%td",resultOffset);
Associative References(關(guān)聯(lián)引用)
objc_setAssociatedObject(設(shè) 置關(guān)聯(lián))
/ policy:關(guān)聯(lián)策略。有五種關(guān)聯(lián)策略剂邮。
OBJC_ASSOCIATION_ASSIGN 等價于 @property(assign)摇幻。 OBJC_ASSOCIATION_RETAIN_NONATOMIC等價于 @property(strong, nonatomic)。 OBJC_ASSOCIATION_COPY_NONATOMIC等價于@property(copy, nonatomic)挥萌。 OBJC_ASSOCIATION_RETAIN等價于@property(strong,atomic)囚企。 OBJC_ASSOCIATION_COPY等價于@property(copy, atomic)。
*/
//參數(shù):1.要關(guān)聯(lián)的對象 2.全局唯一KEY 3.關(guān)聯(lián)的obj 4.關(guān)聯(lián)策略policy
objc_setAssociatedObject(self, [@"LGKey" UTF8String], @"123456",
OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_getAssociatedObject(獲 取關(guān)聯(lián)的值)
//參數(shù):1.關(guān)聯(lián)的對象 2.key
//返回:關(guān)聯(lián)的值
id result = objc_getAssociatedObject(self, [@"LGKey"
UTF8String]);
NSLog(@"lg_objc_getAssociatedObject:%@",result);
objc_removeAssociatedObjects(刪除關(guān)聯(lián))
//參數(shù):關(guān)聯(lián)的對象
objc_removeAssociatedObjects(self);
Sending Messages(發(fā)送消息)
objc_msgSend:向類的實例發(fā)送帶有簡單返回值的消息
objc_msgSend_fpret:將帶有浮點返回值的消息發(fā)送到類的實例
objc_msgSend_stret: 將帶有數(shù)據(jù)結(jié)構(gòu)返回值的消息發(fā)送到類的實例
objc_msgSendSuper:將帶有簡單返回值的消息發(fā)送到類實例的超類
objc_msgSendSuper_stret:將帶有數(shù)據(jù)結(jié)構(gòu)返回值的消息發(fā)送到類實例的超類
Working with Properties(使用屬性)
property_getName(獲取屬性的名稱)
objc_property_t t = class_getProperty(self.class, [@"name" UTF8String]); //參數(shù):objc_property_t
//返回:屬性的名稱
const char *result = property_getName(t);
NSLog(@"lg_property_getName:%@",[NSString stringWithUTF8String:result]);
property_getAttributes(獲取屬 性的屬性)
objc_property_t t = class_getProperty(self.class, [@"name" UTF8String]);
//參數(shù):objc_property_t //返回:屬性的屬性
const char *result = property_getAttributes(t);
NSLog(@"lg_property_getAttributes:%@",[NSString stringWithUTF8String:result]);
property_copyAttributeValue(獲取屬性的指定屬性的值)
//參數(shù):1.objc_property_t 2.屬性的屬性
objc_property_t t = class_getProperty(self.class, [@"name" UTF8String]);
//返回:屬性的屬性的值
char *result = property_copyAttributeValue(t, [@"T" UTF8String]);
NSLog(@"lg_property_copyAttributeValue:%@",[NSString stringWithUTF8String:result]);
property_copyAttributeList(獲 取屬性的屬性列表)
objc_property_t t = class_getProperty([myclass class], [@"name" UTF8String]);
unsigned int count = 0;
//參數(shù):1.objc_property_t 2.unsigned int * //返回:屬性的屬性列表
objc_property_attribute_t *result = property_copyAttributeList(t, &count);
for (int i = 0; i < count; i ++) {
objc_property_attribute_t t = result[i];
NSLog(@"lg_property_copyAttributeList:%@",[NSString stringWithUTF8String:t.name]);
}
Using Objective-C Language Features(使用OC語言特性)
objc_enumerationMutation(檢測到突變時,編譯器將插入次函數(shù) 并且調(diào)用
/參數(shù):id
objc_enumerationMutation(self);
objc_setEnumerationMutationHandler(設(shè)置突變處理函數(shù))
//參數(shù):函數(shù)指針
objc_setEnumerationMutationHandler(enumerationMutationHandler);
Working with Methods(使用方法)
method_invoke:方法調(diào)用
method_invoke_stret:調(diào)用返回值為結(jié)構(gòu)體的方法
method_getName(獲取方法的名稱)
Method method = class_getInstanceMethod(self.class, @selector(lg_method));
//參數(shù):Mothod //返回:SEL指針
SEL result = method_getName(method);
NSLog(@"lg_method_getName:%p",result);
method_getImplementation(獲 取方法的實現(xiàn))
Method method = class_getInstanceMethod(self.class, @selector(lg_method));
//參數(shù):Mothod //返回:IMP指針
IMP result = method_getImplementation(method);
NSLog(@"lg_method_getImplementation:%p",result);
method_getTypeEncoding(獲 取描述方法的參數(shù)和返回值類型 的字符串)
Method method = class_getInstanceMethod(self.class, @selector(lg_method));
//參數(shù):Method //返回:描述方法的參數(shù)和返回值類型的字符串
const char *result = method_getTypeEncoding(method);
NSLog(@"lg_method_getTypeEncoding:%@",[NSString stringWithUTF8String:result]);
method_copyReturnType(獲取 方法的返回值類型)
Method method = class_getInstanceMethod(self.class, @selector(lg_method));
//參數(shù):Method //返回:方法的返回值類型
char *result = method_copyReturnType(method);
NSLog(@"lg_method_copyReturnType:%@",[NSString stringWithUTF8String:result]);
官方API文檔: Apple Developer Documentation
————————————————
版權(quán)聲明:本文為CSDN博主「風(fēng)雨「83」」的原創(chuàng)文章瑞眼,遵循CC 4.0 BY-SA版權(quán)協(xié)議龙宏,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wywinstonwy/article/details/124397283