通过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:[email protected]"NSString",&,N,VmyName


解释:

    在上例中获得propertyAttributes为:[email protected]"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不写。

时间: 2024-10-15 08:08:40

通过OC运行时(runtime)获得类的属性列表的相关文章

OC运行时编程指南

一.介绍 OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时.它会尽可能的动态的处理事情.这意味这个语言不仅需要一个编译器,还需要一个运行时系统去执行编译过的代码.这个运行时系统扮演着对于OC这个语言操作系统的的角色,使得这个语言得以运行. 这个教程将探究NSObject这个类以及OC这个语言和运行时系统是如何进行交互的.特别是如何在运行时动态的根据类的范式加载类,并且传递给其他对象.同时这个教程还将告诉你如何在你的程序运行过程中找到你的对象的运行信息. OC运行时编程指南描述了OC运行时

能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么

不能向编译后得到的类中增加实例变量!能向运行时创建的类中添加实例变量! 因为编译后的类已经注册在runtime中,类结构体中的objc_ivar_list 实例变量的链表和instance_size实例变量的内存大小已经确定,同时runtime 会调用class_setIvarLayout 或 class_setWeakIvarLayout来处理strong weak引用,所以不能向存在的类中添加实例变量. 运行时创建的类是可以添加实例变量,调用 class_addIvar 函数,但是得在调用 

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6 PermissionUtil 经常写Android运行时权限申请代码,每次都是复制过来之后,改一下权限字符串就用,把代码搞得乱糟糟的,于是便有了封装工具类的想法,话不多说,先看怎么用: 工具类及Demo:github 简洁版申请权限 申请一个权限: PermissionUtils.checkAndRequest

通过运行时动态给分类添加属性

#import <UIKit/UIKit.h> /** iOS 开发中,分类默认不允许保存属性 如果在分类中,定义一个属性,需要自己实现 getter & setter 方法,而且没有 _成员变量 如果在自己开发的框架中,希望在分类中动态添加属性,可以通过 OC 运行时的关联对象的功能! 运行时非常重要的一个应用:给分类动态添加属性,结果能够让框架包装的更好,让使用者做出最小的修改! */ @interface UIImageView (WebImage) @property (non

##oc在类别里给类加属性以及原理

oc在类别里给类加属性以及原理 如何在类别里给类加属性呢,有鸭子模样的我们就认为他是鸭子了. @interface NSObject (XY) @property (nonatomic, strong) id tempObject; @end @implementation NSObject (XY) @dynamic tempObject; - (id)tempObject - { id object = objc_getAssociatedObject(self, NSObject_key_

Objective-C Runtime 运行时之一:类与对象

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Runtime其实是一个Runti

[ObjectC]Runtime 运行时之一:类与对象

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Runtime其实是一个Runtime

Runtime 运行时之一:类与对象

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Runtime其实是一个Runti

关于对OC运行时机制的理解

首先,第一个问题, 1>runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API. 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者 比如说,下面一个创建对象的方法中, 举例: OC : [[MJPerson alloc] init] runtime : objc_msgSe