OC 的 Runtime 動態獲取對象屬性

運行時是 OC 的核心,其特點就是程序在運行的時候,以發送消息的形式調用方法.

在實際開發中,關於運行時方面的運用點,其實並不多,最常用的也無非是動態獲取對象的屬性.

示例:

1.新建一個繼承自NSObject 的對象,在. h 文件聲明2個屬性

#import <Foundation/Foundation.h>


@interface Person : NSObject


@property (nonatomic, copy) NSString *name;

@property (nonatomic, assign) NSInteger age;


@end


2.新建一個 NSObject 的類別 

.h 文件

#import <Foundation/Foundation.h>


@interface NSObject (Runtime)


+(NSArray*)zyfObjProperties;


@end


.m 文件

#import "NSObject+Runtime.h"

#import <objc/runtime.h>


@implementation NSObject (Runtime)


+(NSArray *)zyfObjProperties{

    //調用運行時方法,取得類的屬性列表

    //Ivar 成員變量

    //Method 方法

    //Property 屬性

    //Protocol 協議

    unsigned int count = 0;

    objc_property_t *proList = class_copyPropertyList([self class], &count);

    NSMutableArray *mArr = [NSMutableArray array];

    for (unsigned int i = 0; i < count; i++) {

        //從數組中取得屬性

        objc_property_t pty = proList[i];

        //從中獲得屬性名稱

        const char *cName = property_getName(pty);

        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];

        [mArr addObject:name];

    }

    NSLog(@"屬性的個數 %d", count);

    free(proList);

    return mArr.copy;

}


@end


3.導入新建的類和分類,然後調用

NSArray *properties = [Person zyfObjProperties];

NSLog(@"%@",properties);


注意, c語言的 copy 後,需要釋放,oc 在運行時是不會對 c 做自動內存管理的.


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