• 成员变量

首先我们来看看成员变量在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-对成员变量和属性的操作的更多相关文章

  1. Objective-C Runtime 运行时之二:成员变量与属性(转载)

    在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现. 本章的主要内容将聚集在Runtime ...

  2. Runtime之成员变量&属性&关联对象

    上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@e ...

  3. 刨根问底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 ...

  4. runtime第二部分成员变量和属性

    接上一篇 http://www.cnblogs.com/ddavidXu/p/5912306.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...

  5. Objective-C Runtime 运行时之二:成员变量与属性

    类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的 ...

  6. OC基础成员变量、属性变量、实例方法与类方法

    首先,为什么我们要定义一个新类呢?按照我的理解,就是为了抽象出来一个新的东西(也就是类),用来存储更多的数据变量和方法,一切类都直接或间接继承与NSObject. 在类的头文件里我们可以定义成员变量. ...

  7. C# 成员变量和属性的区别

    之前一直在C#中使用这两者, 却一直不知道成员变量和属性还是不一样的两种概念. 不过说不一样, 也不是完全对. 简单举个例子: public class myclass { public string ...

  8. C++ 通过对象方式 、指针方式两种方式去访问成员变量(属性或者方法)

    准备 1.在VS中新建一个项目-Viscal C++ ---常规--空项目 2.建立一个.h的头文件 定义一个类 声明其成员(C#中的属性和方法) #include<iostream> # ...

  9. iOS 成员变量和属性的区别

    一. 成员变量 1.成员变量的作用范围: @public:在任何地方都能直接访问对象的成员变量 @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法 @p ...

随机推荐

  1. C#冒泡排序算法

    用了两种形式的数据,一个是泛型List,一个是数据int[].记录一下,作为自己学习过程中的笔记. using System; using System.Collections.Generic; us ...

  2. 理解OVER子句

    简介 Over子句在SQLServer 2005中回归,并且在2012中得到了扩展.这个功能主要结合窗口函数来使用:也可以在序列函数"NEXT VALUE FOR"使用.OVER子 ...

  3. ASP.NET MVC Routing、Areas、URLs

    webForm页面运行起来url一般是这样的:localhost:****/index.aspx,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在浏览 ...

  4. Spark——SparkContext简单分析

    本篇文章就要根据源码分析SparkContext所做的一些事情,用过Spark的开发者都知道SparkContext是编写Spark程序用到的第一个类,足以说明SparkContext的重要性:这里先 ...

  5. IISExpress Log 文件路径

    问题 用VS做开发时经常用IISExpress测试web程序,那么在测试过程中生成的Log文件放在哪里了? 答案 情况1 默认情况下 applicationhost.config 文中定义了连个日志文 ...

  6. HTML 学习笔记 JQuery(DOM 操作)

    一般来说,DOM操作分为三个方面,即:DOM Core(核心), HTML_DOM 和 CSS_DOM. 1.DOM Core DOM Core 并不专属于JavaScript,任何一种支持DOM的程 ...

  7. 有理数的稠密性(The rational points are dense on the number axis.)

    每一个实数都能用有理数去逼近到任意精确的程度,这就是有理数的稠密性.The rational points are dense on the number axis.

  8. 分布式监控系统Zabbix-3.0.3-完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  9. [LeetCode] Power of Three 判断3的次方数

    Given an integer, write a function to determine if it is a power of three. Follow up:Could you do it ...

  10. [LeetCode] Reorder List 链表重排序

    Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...