YYEncodingType方法的作用,怎么知道這些數(shù)據(jù)怎么取,由于是獲取類型編碼,獲取也是看ivar_getTypeEncoding的quick help(xcode的提示):
- const一類的限定符
- int、NSArray、struct等數(shù)據(jù)類型
將以上兩種編碼字符串轉(zhuǎn)換為自己所定義的枚舉類型,方法自己轉(zhuǎn)換。除了上面兩種,在屬性中,還有retain,nonatomic,weak等屬性特征編碼,總共三大類型編碼。
YYClassIvarInfo的封裝(即實(shí)例變量Ivar的封裝,class_copyIvarList獲取):
- 實(shí)例變量名字(ivar_getName獲?。?/li>
- 偏移量(ivar_getOffset獲?。?/li>
- 原始類型編碼
- 自己定義的類型編碼(枚舉類型,通過YYEncodingType獲取)
YYClassMethodInfo的封裝(即方法Method的封裝,class_copyMethodList獲取)
- 方法名(method_getName)
- 實(shí)現(xiàn)(method_getImplementation)
- 選擇器(sel_getName根據(jù)方法名獲取)
- 原始方法編碼(method_getTypeEncoding)
- 返回原始類型編碼字符串(method_copyReturnType)
-
參數(shù)原始類型編碼數(shù)組(method_getNumberOfArguments、method_copyArgumentType)
根據(jù)method_copyArgumentType獲取的幾個(gè)參數(shù),在Objective-C中,消息是通過objc_msgSend()這個(gè)runtime方法及相近的方法來實(shí)現(xiàn)的。這個(gè)方法需要一個(gè)target,selector,還有一些參數(shù)。理論上來說,編譯器只是把消息分發(fā)變成objc_msgSend來執(zhí)行。
image.png
所以上面自然就是objc_msgSend(self,@selector(setSSLPinningMode:),Q類型的參數(shù)),所以setSSLPinningMode:是有三個(gè)參數(shù),而不是一個(gè)。
YYClassPropertyInfo的封裝(即屬性objc_property_t的封裝,class_copyPropertyList獲取)
- 屬性名(property_getName)
- 原始類型編碼(property_copyAttributeList獲取特征數(shù)組,name為T對應(yīng)的value就是類型編碼)
- 所屬類Class(根據(jù)特征數(shù)組name為T對應(yīng)的value就是類型編碼判斷,如果是對象,則獲取Class,否則為空)
- 屬性對應(yīng)的變量名(property_copyAttributeList獲取特征數(shù)組,name為V對應(yīng)的value就是變量名,需要判斷value是否為空,暫時(shí)沒理解為什么)
- 自己定義的類型編碼(這是一個(gè)枚舉類型,property_copyAttributeList特征數(shù)組能獲取相應(yīng)的類型編碼、變量名、屬性特征編碼,這里取的是類型編碼和屬性特征編碼)
-
獲取和讀取選擇器(通過特征數(shù)組的其中一個(gè)特征結(jié)構(gòu)體獲取,有value則獲取)
property_copyAttributeList獲取的特征數(shù)組attrs的一個(gè)示例:
image.png
T就是類型編碼,&就是retain屬性特征,N就是nonatomic屬性特征,V就是變了名
Property(retain,nonatomic)NSString *url;
YYClassInfo的封裝(通過Class獲取)
- 父類(class_getSuperclass)
- 是否元組(class_isMetaClass)
- 類的元組類(objc_getMetaClass、class_getName)
- 屬性信息數(shù)組(YYClassIvarInfo的封裝)
- 方法信息數(shù)組(YYClassMethodInfo的封裝)
- 實(shí)例變量數(shù)組(YYClassPropertyInfo的封裝)
- 細(xì)說classInfoWithClass
- classInfoWithClass做了性能優(yōu)化,如果不優(yōu)化的話,其實(shí)initWithClass已經(jīng)足夠了。
static dispatch_semaphore_t lock;
lock = dispatch_semaphore_create(1);
dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
dispatch_semaphore_signal(lock);
dispatch_semaphore_signal會(huì)讓信號(hào)量加1
dispatch_semaphore_wait會(huì)讓信號(hào)量減1,當(dāng)信號(hào)總量少于0的時(shí)候就會(huì)一直等待,否則就可以正常的執(zhí)行
待續(xù)...

