通過OC運行時(runtime)獲得類的屬性列表

        最近一段時間在研究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不寫。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章