`
zjjzmw1
  • 浏览: 1366388 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

iOS运行时机制

    博客分类:
  • iOS
c 
阅读更多

http://my.oschina.net/panyong/blog/298631    

转载的。

 

我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助!

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

第二个问题 
runtime 用来干什么呢??用在那些地方呢?怎么用呢? 
runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)

  • 在程序运行过程中, 动态创建一个类(比如KVO的底层实现)

  • 在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法

  • 遍历一个类的所有成员变量(属性)\所有方法 
    例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置! 
    例如,PYPerson.h的文件如下所示

    import

@interface PYPerson : NSObject 
@property (nonatomic, assign) int age; 
@property (nonatomic, assign) int height; 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, assign) int age2; 
@property (nonatomic, assign) int height2; 
@property (nonatomic, assign) int age3; 
@property (nonatomic, assign) int height3; 
@property (nonatomic, assign) int age4; 
@property (nonatomic, assign) int height4;

@end

而PYPerson.m实现文件的内容如下

<!-- lang: cpp -->
#import "PYPerson.h"

import

@implementation PYPerson

  • (void)encodeWithCoder:(NSCoder )encoder 

    unsigned int count = 0; 
    Ivar 
    ivars = class_copyIvarList([PYPerson class], &count);

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

    // 取出i位置对应的成员变量
    Ivar ivar = ivars[i];
    
    // 查看成员变量
    const char *name = ivar_getName(ivar);
    
    // 归档
    NSString *key = [NSString stringWithUTF8String:name];
    id value = [self valueForKey:key];
    [encoder encodeObject:value forKey:key];
    

    }

    free(ivars); 
    }

  • (id)initWithCoder:(NSCoder *)decoder 

    if (self = [super init]) {

    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([PYPerson class], &count);
    
    for (int i = 0; i<count; i++) {
        // 取出i位置对应的成员变量
        Ivar ivar = ivars[i];
    
        // 查看成员变量
        const char *name = ivar_getName(ivar);
    
        // 归档
        NSString *key = [NSString stringWithUTF8String:name];
        id value = [decoder decodeObjectForKey:key];
    
        // 设置到成员变量身上
        [self setValue:value forKey:key];
    }
    
    free(ivars);
    


    return self; 
    }

@end

这样我们可以看到归档和解档的案例其实是runtime写下的

学习,runtime机制首先要了解下面几个问题 
1相关的头文件和函数 
1> 头文件


  • 利用头文件,我们可以查看到runtime中的各个方法!

2> 相关应用

  • NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)
  • 字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)
  • KVO(利用runtime动态产生一个类)
  • 用于封装框架(想怎么改就怎么改) 
    这就是我们runtime机制的只要运用方向

3> 相关函数

  • objc_msgSend : 给对象发送消息
  • class_copyMethodList : 遍历某个类所有的方法
  • class_copyIvarList : 遍历某个类所有的成员变量
  • class_….. 
    这是我们学习runtime必须知道的函数!

4.必备常识 
1> Ivar : 成员变量 
2> Method : 成员方法 
从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method,

 

也许,看到这里,你是否对runtime有了更深入的了解呢?在这里,希望我们大家相互交流!有什么错误之处,还请指正 

分享到:
评论

相关推荐

    iOS运行时(runtime)示例代码

    iOS运行时(Runtime)是Apple为其移动操作系统iOS和macOS提供的一种核心技术,它是一个底层的接口,使得开发者能够与Objective-C和Swift等编程语言的运行环境进行交互。在这个环境中,对象、类、方法以及消息传递等...

    objective-c运行时编程指南

    ### Objective-C运行时编程指南 #### 导言 Objective-C是一种强大的面向对象编程语言,它在编译和链接阶段保留了大量的灵活性,将其推迟至运行时处理。这种特性使得Objective-C能够在运行时动态地加载类、解析方法...

    iOS消息转发机制在项目中的应用

    iOS的消息转发机制是Objective-C(OC)语言中一个至关重要的特性,它允许对象在接收到无法响应的消息时有机会处理或转发这些消息。这一机制对于理解OC的动态性以及解决一些特定问题,如方法的动态绑定、类的扩展等,...

    ios runtime消息转发机制

    在iOS开发中,Objective-C的运行时(Runtime)系统是一个强大的特性,它使得Objective-C具有了动态性。本文将深入探讨“ios runtime消息转发机制”,理解这个机制对于优化代码、解决潜在问题以及实现高级功能至关...

    Objective-C 2.0运行时

    Objective-C 2.0运行时系统编程指南。介绍从底层介绍iOS运行时机制。

    iOS沙盒机制简介

    **沙盒机制**是iOS操作系统中的一项重要安全特性,它确保每个应用程序都运行在一个独立且受限的环境中,以此来保护用户数据的安全和隐私。简单来说,沙盒机制为每一个iOS应用程序创建了一个隔离的“沙盒”,应用程序...

    iOS后台运行

    理解并掌握iOS后台运行机制是开发高质量iOS应用的关键。合理运用不同的后台模式和任务,可以提升用户体验,同时注意优化性能和遵守审核规则,才能确保应用能在App Store顺利上线并提供优质服务。通过不断学习和实践...

    ios系统机制介绍

    在数据安全性方面,iOS系统具有强大的防护机制,保护用户隐私不被侵犯,这在当前个人信息安全问题日益突出的时代尤为重要。 App Store作为iOS应用的主要来源,拥有数十万款应用,涵盖了生活、工作、娱乐等各个领域...

    iOS消息转发机制及避免崩溃的解决方案.pdf

    iOS的消息转发机制是Objective-C运行时系统中一个关键特性,它允许对象在接收到未实现的方法调用时,有机会去处理或转发这个消息,从而防止程序因无法识别选择子(selector)而崩溃。这一机制主要包含三个步骤: 1....

    iOS如何保持程序在后台长时间运行

    在iOS平台上,应用程序在后台运行的能力受到严格的限制,这是为了优化电池寿命和系统性能。iOS采用了墓碑式后台管理模式,大部分应用在用户按下Home键后只能在后台运行有限的时间。通常,应用程序在转入后台后有180...

    iOS学习——通知机制-代码

    在iOS开发中,通知机制(Notification)是一种非常重要的组件,用于在应用程序的不同组件之间传递信息。这个机制允许对象发送消息给其他对象,而无需知道接收者的具体身份,从而实现了松耦合的设计。本文将深入探讨...

    ios 程序在后台运行的demo

    总之,"ios 程序在后台运行的demo"可能展示了如何利用iOS提供的各种机制,使得应用能在后台保持运行或者在后台执行特定任务。理解和掌握这些技巧对于开发高效、用户体验良好的iOS应用至关重要。

    delphi ios后台运行BackgroundFetchDemo

    在Delphi开发iOS应用时,我们可以利用`Background Fetch`这一机制来实现后台运行。本示例"BackgroundFetchDemo"就是展示了如何在Delphi中启用并处理iOS的后台刷新事件。 首先,我们需要理解什么是`Background Fetch...

    ios-对象的消息转发机制.zip

    总之,iOS中的对象消息转发机制是Objective-C运行时的重要特性,它提供了处理未知消息的手段,使得我们的代码更加灵活和健壮。理解并掌握这一机制,可以帮助我们编写出更加高效、稳定且易于维护的iOS应用。

    关于iOS App后台运行的调研报告.pdf

    为了更好地理解iOS应用后台运行机制及其应用场景,本报告对iOS官方文档中关于后台运行的相关规定进行了深入研究,并结合实际案例进行分析。 #### 二、iOS后台运行概述 iOS系统的后台运行机制是为了提高用户体验而...

    解决ios下后台运行与锁屏时倒计时停止问题

    标题"解决ios下后台运行与锁屏时倒计时停止问题"正是针对这一常见挑战,而描述中的内容则提供了解决方案的方向。 当iOS应用被切换到后台,Apple的沙盒机制会自动暂停大部分非必要进程,包括Web视图(如WKWebView)...

    IOS 稳定无限后台运行

    4. **稳定性与无限运行**:实现应用稳定无限后台运行的关键在于合理利用iOS提供的后台机制,并确保代码优化,避免无用的资源消耗。描述中提到自测超过4天,说明开发者可能已经实现了有效的电池管理和后台运行策略。 ...

    ios图片下载机制

    在iOS应用开发中,图片下载机制是一个至关重要的环节,因为它直接影响到用户体验和应用程序的性能。在资源有限的移动设备上,高效地管理和下载图片对于节省内存、提高运行速度以及优化电池寿命都至关重要。本示例...

    ios消息转发机制

    在iOS开发中,消息转发机制是Objective-C运行时(Runtime)系统的一个重要特性,它使得对象在接收到无法响应的消息时,有机会进行处理,而不是直接抛出“未定义选择子”(Undefined selector)的错误。这个机制提高...

    iOS沙盒机制

    开发者必须遵循沙盒机制,合理地组织和管理应用的数据,确保应用能在iOS系统中安全、高效地运行。随着iOS平台的不断更新和升级,沙盒机制也在不断地完善和发展,开发者需要持续学习和适应新的变化。

Global site tag (gtag.js) - Google Analytics