runtime-对成员变量和属性的操作
- 成员变量
首先我们来看看成员变量在runtime中是什么样的
在runtime中成员变量是一个objc_ivar类型的结构体,结构体定义如下
struct objc_ivar {
char *ivar_name OBJC2_UNAVAILABLE;//成员变量的名字
char *ivar_type OBJC2_UNAVAILABLE;//成员变量的类型
int ivar_offset OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
}
我们利用runtime对成员变量进行操作主要有以下几种:
Ivar *class_copyIvarList(Class cls, unsigned int *outCount) //获取所有成员变量
const char *ivar_getName(Ivar v) //获取某个成员变量的名字
const char *ivar_getTypeEncoding(Ivar v) //获取某个成员变量的类型编码
Ivar class_getInstanceVariable(Class cls, const char *name) //获取某个类中指定名称的成员变量
id object_getIvar(id obj, Ivar ivar) //获取某个对象中的某个成员变量的值
void object_setIvar(id obj, Ivar ivar, id value) //设置某个对象的某个成员变量的值
接下来上代码来使用一下这些函数,首先我们在.h文件中定义一个Person类,并声明一个personGetMessage方法和自定义类方法
personGetMessage方法是打印出对象的信息,自定义类方法就是创建对象并给对象赋值
{
NSString *clan;
}
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSNumber *height;
@property (nonatomic, copy) NSString *gender;
- (void)personGetMessage;// 打印出对象的信息
// 创建对象并给对象赋值
+ (Person *)personWithClan:(NSString *)clan name:(NSString *)name age:(NSInteger)age height:(NSNumber *)height gender:(NSString *)gender;
然后是在.m文件中的实现
- (void)personGetMessage {
unsigned int count;
// 参数一:类名 参数二:成员变量的数量
Ivar *ivarList = class_copyIvarList([self class], &count);
for (int i = ; i < count; i ++) {
Ivar ivar = ivarList[i];
// 输出成员变量的名字,类型编码和值
NSLog(@"name = %s, typeEncoding = %s, value = %@",ivar_getName(ivar), ivar_getTypeEncoding(ivar), object_getIvar(self, ivar));
}
}
+ (Person *)personWithClan:(NSString *)clan name:(NSString *)name age:(NSInteger)age height:(NSNumber *)height gender:(NSString *)gender {
Person *person = [[Person alloc] init];
unsigned int count;
Ivar *ivarList = class_copyIvarList(self, &count);// 获取所有成员变量
/**
* 设置某个对象的某个成员变量的值
*
* @param obj#> 要设置的对象 description#>
* @param ivar#> 对象的成员变量 description#>
* @param value#> 成员变量的值 description#>
*/
object_setIvar(person, ivarList[], clan);
object_setIvar(person, ivarList[], name);
object_setIvar(person, ivarList[], @(age));
object_setIvar(person, ivarList[], height);
Ivar ivar = class_getInstanceVariable(self, "_gender");
object_setIvar(person, ivar, gender);
return person;
}
在程序的入口创建Person对象并且调用presonGetMessage方法控制台就会打印出我们创建的person对象的信息
Person *person = [Person personWithClan:@"汉族" name:@"zhangsan" age: height:@ gender:@"male"];
[person personGetMessage];

以上两个方法的实现基本上把成员变量的基本操作函数都使用了一遍,接下来我们看看属性在runtime中是什么样的
- 属性
属性在runtime中的定义如下
/// An opaque type that represents an Objective-C declared property.
typedef struct objc_property *objc_property_t;
/// Defines a property attribute
typedef struct {
const char *name; /**< The name of the attribute */
const char *value; /**< The value of the attribute (usually empty) */
} objc_property_attribute_t;
属性的本质是一个指向objc_property的结构体指针。跟成员变量一样,runtime中一样为属性定义了一系列对属性的操作函数:
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) //获取所有属性的列表
const char *property_getName(objc_property_t property) //获取某个属性的名字
const char *property_getAttributes(objc_property_t property) //获取属性的特性描述
objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount) //获取所有属性的特性
接下来我们来使用一下上述这些方法,依然还是在Person类中操作
在.h文件中声明一个getAttributeOfproperty的实例方法并在.m文件中实现这个方法
- (void)getAttributeOfproperty
{
unsigned int outCount;
objc_property_t *propertyList = class_copyPropertyList([Person class], &outCount);
for (NSInteger i = ; i < outCount; i ++) {
NSLog(@"属性:%s,它的特性描述:%s",property_getName(propertyList[i]),property_getAttributes(propertyList[i]));// 获取属性列表只会获取有property属性声明的变量
}
}
因为获取属性列表只会获取有property属性声明的变量,所以成员变量clan就获取不到了,以下是这个方法的打印结果

runtime-对成员变量和属性的操作的更多相关文章
- Objective-C Runtime 运行时之二:成员变量与属性(转载)
在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现. 本章的主要内容将聚集在Runtime ...
- Runtime之成员变量&属性&关联对象
上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@e ...
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective[nil]c-runtime(4)[nil]-cheng-yuan-bian-lian ...
- runtime第二部分成员变量和属性
接上一篇 http://www.cnblogs.com/ddavidXu/p/5912306.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...
- Objective-C Runtime 运行时之二:成员变量与属性
类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的 ...
- OC基础成员变量、属性变量、实例方法与类方法
首先,为什么我们要定义一个新类呢?按照我的理解,就是为了抽象出来一个新的东西(也就是类),用来存储更多的数据变量和方法,一切类都直接或间接继承与NSObject. 在类的头文件里我们可以定义成员变量. ...
- C# 成员变量和属性的区别
之前一直在C#中使用这两者, 却一直不知道成员变量和属性还是不一样的两种概念. 不过说不一样, 也不是完全对. 简单举个例子: public class myclass { public string ...
- C++ 通过对象方式 、指针方式两种方式去访问成员变量(属性或者方法)
准备 1.在VS中新建一个项目-Viscal C++ ---常规--空项目 2.建立一个.h的头文件 定义一个类 声明其成员(C#中的属性和方法) #include<iostream> # ...
- iOS 成员变量和属性的区别
一. 成员变量 1.成员变量的作用范围: @public:在任何地方都能直接访问对象的成员变量 @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法 @p ...
随机推荐
- Memcached初探
一.Memcached是什么 Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached基于 ...
- 批量创建10个用户stu01-stu10
1.批量创建10个用户stu01-stu10,并且设置随机8位密码,要求不能用shell循环(例如:for,while等),只能用命令及管道实现. ##方法1: [root@server tmp]# ...
- Linux初识二
1. Linux上常用的文件管理命令及使用 (1) CP命令:复制文件或文件夹语法格式 cp [OPTION]... [-T] SOURCE DEST // 单源复制 cp [OPTION]... S ...
- [转]Writing Custom Middleware in ASP.NET Core 1.0
本文转自:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ One of the new ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- init.d functions的daemon函数
daemon函数说明 # 该函数的作用是启动一个可执行的二进制程序: # 使用方法: # .daemon {--check program|--check=program} [--user usern ...
- IE10 IE11 中 网站无法登录问题cookie
方法一: 在程序文件中添加此文件 在项目中创建一个文件夹将下载的文件直接拖入文件夹中 来源于:http://www.hanselman.com/blog/BugAndFixASPNETFailsToD ...
- bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法
筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...
- 1229【MySQL】性能优化之 Index Condition Pushdown
转自http://blog.itpub.net/22664653/viewspace-1210844/ [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...
- 利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml ...