最近一段時間在研究OC的運行時機制,碰到一個叫property_getAttributes函數,再此對其用法進行簡單的總結。
property_getAttributes主要用於獲取一個類的property即該property的屬性數據,也叫metadata(元數據),涉及到得運行時函數包括class_copyPropertyList,property_getName和propert_getAttributes
大體用法如下:
#import <objc/runtime.h> ...... - (void)custom{ unsigned pCount; objc_property_t *properties=class_copyPropertyList([self class], &pCount);//屬性數組 for(int i=0;i<pCount;++i){ objc_property_t property=properties[i]; NSLog(@"propertyName:%s",property_getName(property)); NSLog(@"propertyAttributes:%s",property_getAttributes(property)); } }
具體用法如下:
eg.定義了一個類CustomClass,有屬性定義如下
頭文件:
CustomClass.h #import <objc/runtime.h> ...... @property (nonatomic, strong)NSString *myName;
實現文件:
CustomClass.m @synthesize myName; - (void)printAllAttributes{ unsigned pCount; objc_property_t *properties=class_copyPropertyList([self class], &pCount);//屬性數組 for(int i=0;i<pCount;++i){ objc_property_t property=properties[i]; NSLog(@"propertyName:%s",property_getName(property)); NSLog(@"propertyAttributes:%s",property_getAttributes(property)); } }
最後的輸出結果如下:
2015-08-12 12:56:45.147 UIMenuController[1924:146558] propertyName:myName
2015-08-12 12:56:45.147 UIMenuController[1924:146558] propertyAttributes:T@"NSString",&,N,VmyName
解釋:
在上例中獲得propertyAttributes爲:T@"NSString",&,N,VmyName
這是一個char *類型.
T:開頭字母
@"NSString":property的類型。@表示此property是OC類,"NSString"表明具體的OC類名。例如:
id myName;//@
UIColor *myName;//@"UIColor"
UITextField *myName;//@"UITextField"
CustomClass *myName;//@"CustomClass",爲自定義類型
int myName;//i,即若爲基本數據類型,則只是@encode(int)的值i
&:表明property爲retain(strong),除此之外,C表示copy,assign沒有表示。
N:表示nonatomic,若爲atomic則不寫。
VmyName:V開頭加property名
此外,讀寫屬性:readonly表示爲R,readwrite不寫。