我理解的iOS中的RunTime机制(1)

一、首先我们要先知道object-c是一门编译型、动态语言(这里强调下oc是静态类型语言),这在开发语言中是并多见的,一般的动态语言多为解释性语言。oc之所以能够做到即使编译型语言,又是动态语言。就是得益于RunTime机制。

由于本文主要讲解的是RunTime机制,所以语言类型不做过多描述,之后可以另写一篇语言类型的介绍。

二、这里主要讲解RunTime如何使用,其中主要的知识点如下:

1、class_copyPropertyList  获取一份拷贝的成员列表数组

2、property_getName 获取成员名称

3、class_getInstanceVariable  获取成员对象的Ivar

4、object_getIvar 从Ivar对象中取值

5、object_setIvar
赋值函数

下面我们来看一下代码实现:

1、创建一个类

CustomClass.h

#import <Foundation/Foundation.h>

@interface CustomClass : NSObject

@property (nonatomic , strong) NSString *age;

- (void)test;

@end

CustomClass.m

#import "CustomClass.h"

@implementation CustomClass

- (void)test
{
    NSLog(@"这里是CustomClass");

}

@end

接下来创建一个类别来实现RunTime机制

NSObject+RunTimeTest.h

#import <Foundation/Foundation.h>

@interface NSObject (RunTimeTest)

//动态创建一个类,之后为这个类的age属性赋值。
- (id) testRunTime:(NSString *)classname age:(NSString *)age;

@end

NSObject+RunTimeTest.m

#import "NSObject+RunTimeTest.h"
#import <objc/runtime.h>
#import "CustomClass.h"

@implementation NSObject (RunTimeTest)

- (CustomClass *)testRunTime:(NSString *)classname age:(NSString *)age
{
    // propertyCount 成员属性的数量
    unsigned int propertyCount = 0;
    /* objc_property_t 根据苹果文档的解释:An opaque type that represents an Objective-C declared property.
        个人理解:一个任意类型的对象代表一个oc声明的属性成员 (本人英语水平实在有限)*/
    /* class_copyPropertyList
     文档:Return Value
     An array of pointers of type objc_property_t describing the properties declared by the class. Any properties declared by superclasses are not included. The array contains *outCount pointers followed by a NULL terminator. You must free the array with free().
     个人理解:主要2个意思:返回一个数组指针,类型为objc_property_t,用完要记得free,释放掉。
     */
    objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
    for (unsigned int i = 0; i < propertyCount; i++) {
        objc_property_t property = properties[i];
        //获取成员的名称
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        NSLog(@"propertyName = %@ -- 成员名称",propertyName);

        //获取成员内容的Ivar
        Ivar iVar = class_getInstanceVariable([self class], [propertyName UTF8String]);
        //其实上面那行获取代码是为了保险起见,基本是获取不到内容的。因为成员的名称默认会在前面加"_" ,
        if (iVar == nil) {
            iVar = class_getInstanceVariable([self class], [[NSString stringWithFormat:@"_%@",propertyName] UTF8String]);
        }

        //  取值
        id propertyVal = object_getIvar(self, iVar);
        NSLog(@"propertyVal = %@ --值",propertyVal);

        // 动态创建类
        Class varClass = NSClassFromString(classname);
        id varObj = [[varClass alloc] init];
        //调用新创建类的方法,这里要主要一定引入对应得头文件,不然调用方法会不错。
        [varObj test];

        Ivar iVarObj = class_getInstanceVariable(varClass, [@"_age" UTF8String]);

        object_setIvar(varObj, iVarObj, age);

        return varObj;
    }
    return nil;

}

@end

测试:

ViewController.m

#import "NSObject+RunTimeTest.h"
#import "CustomClass.h"

@interface ViewController ()

@property (nonatomic , strong) NSString *name;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _name = @"xiaonan";
    CustomClass *tmp = [self testRunTime:@"CustomClass" age:@"098"];
    NSLog(@"tmp.age = %@",tmp.age);

}

结果输出:

2014-11-29 17:16:55.483 TestRunTime2[21001:176367] propertyName = name -- 成员名称
2014-11-29 17:16:55.483 TestRunTime2[21001:176367] propertyVal = xiaonan --值
2014-11-29 17:16:55.484 TestRunTime2[21001:176367] 这里是CustomClass
2014-11-29 17:16:55.484 TestRunTime2[21001:176367] tmp.age = 098

原文地址:http://blog.csdn.net/qqmcy/article/details/41596725

时间: 2024-12-14 18:49:31

我理解的iOS中的RunTime机制(1)的相关文章

Deep Learning基础--理解LSTM/RNN中的Attention机制

导读 目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门,是因为它在许多领域较其他的传统模型方法都取得了更好的结果.这种结构的模型通常将输入序列编码成一个固定长度的向量表示,对于长度较短的输入序列而言,该模型能够学习出对应合理的向量表示.然而,这种模型存在的问题在于:当输入序列非常长时,模型难以学到合理的向量表示. 在这篇博文中,我们将探索加入LSTM/RNN模型中的attention机制是如何克服传统编码器-解码器结构存在的问题的. 通过阅读这篇博文,你将会学习到: 传

【理解】 iOS沙盒(sandbox)机制(一)

1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行. 通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:san

iOS中利用 runtime 一键改变字体

http://www.cocoachina.com/ios/20160504/16109.html 本文为投稿文章,作者:HenryCheng(简书) 最近公司要在5月份举办个大型的发布会,所以在这之前要把版本稳定,界面提升,所以有很多细活要干.不过,趁前两天版本刚提交上线,这两天稍微闲一点,就把之前说的利用runtime一键改变字体的方法分享出来.有人会说,改变字体不是很简单吗,我直接找到字体名替换一下不就好了?客官不要急,先坐下来吃点瓜子,听我慢慢给你说来. 1.准备 我们新建一个项目名叫C

iOS开发之Runtime机制深入解析

本篇主要讲述在 OC 开发中主要涉及到的运行时机制: 运行时的工作: 运行时在 OC 中的工作:OC 语言的设计模式决定了尽可能的把程序从编译和链接时推迟到运行时.只要有可能,OC 总是使用动态的方式来解决问题.这意味着 OC 语言不仅需要一个编译器,同时也需要一个运行时系统来执行编译好的代码.这儿的运行时系统扮演的角色类似于 OC 语言的操作系统,OC 基于该系统来工作.  运行时的简单应用: OC 2.0运行时系统参考库描述了OC 运行库的数据结构和函数接口.程序可以通过这些接口来和 OC

【理解】 iOS沙盒(sandbox)机制(二)

1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, [cpp] view plain copy NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSLog(@"documentsDirectory

iOS中的通知机制

每一个应用程序都有一个通知中心,NSNotificationCenter,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发布通知NSNotification,描述自己在做什么.其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知 ?一个完整的通知一般包含3个属性: ?- (NSString *)name; // 通知的名称 ?- (id)object; // 通知发布者(是谁要发布通知) ?- (NSDictionary

iOS runtime机制 和数据库结合 使用方便开发

1 首先说一下 runtime 运行机制 对于OC 这门高级编程语言 其实在语言底层的实现 是用C语言来实现的 一个OC的类 翻译成C 语言其实就是一个结构体的类型,当然结构体是非常复杂的包括了这个类的所有信息,类的继承还是有点难度的,暂时不用考虑类的继承的问题,只要知道OC类 底层是转换成 C语言的结构体! 我们先看一下 OC 是怎样发送消息的 也就是对应C语言是如何实现函数的调用的过程! [obj makeText];   //obj 这个类发送了一个  makeText的消息 之后runt

iOS中消息的传递机制(KVO、Notification、delegation、block以及target-action)---转载

注1:本文由破船[博客]译自Communication Patterns. 本文目录如下所示: 可用的机制 做出正确的选择 Framework示例 小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还

ios开发新手浅谈强大的runtime机制

runtime机制,实际上是一套底层的C语言代码,里面提供了很多的C数据类型和一些功能强大的C语言函数.我们所写的OC代码,在底层都是基于runtime来实现的.所以我们可以说OC实际就是披着面向对象外衣的C语言,因为在运行时,OC代码会编译成C/C++ 来运行.runtime中有很多的C函数,有着很强大的功能,比如 : 1. 能动态类的增删改 成员变量,方法 2.IOS Swizzle 能底层动态的交换两个方法(类方法和对象方法)的实现 IOS swizzle的具体做法: 1.在分类的load