RunTime 运行时研究及解析

Java Web 图书管理系统的制作指南 实现对图书信息的增删改查(CRUD)操作。支持用户登录与权限管理。图书借阅与归还功能。系统管理员可以管理用户信息和图书库存。 阅读详情

RunTime 一个貌似很高深的东西,但是如果真的会用了其实也不是很难

情况1 在程序运行的时候更换已经写好的方法

事例代码
//
//  Studet.m
//  Runtime_Nscoding
//
//  Created by 杨小兵 on 15/8/5.
//  Copyright (c) 2015年 杨小兵. All rights reserved.
//

#import "Studet.h"
#import <objc/runtime.h>

@implementation Studet
+ (void)load
{
    // 获取类方法
    Method m1 = class_getClassMethod([self class], @selector(test1:));
    Method m2 = class_getClassMethod([self class], @selector(test2:));
    method_exchangeImplementations(m1, m2);
    //获取对象方法
    Method m3 = class_getInstanceMethod([self class], @selector(test1:));
    Method m4 = class_getInstanceMethod([self class], @selector(test2:));
    method_exchangeImplementations(m3, m4);
}
- (instancetype)init
{
    if (self = [super init])
    {
        [self test1:@"test1"];
        [self test2:@"test2"];
    }
    return self;
}
+ (void)test1:(NSString *)string
{
    
    NSLog(@"我是+++++test1 %@ %@",NSStringFromSelector(_cmd),string);
}
+ (void)test2:(NSString *)string
{
    NSLog(@"我是-----test2 %@ %@",NSStringFromSelector(_cmd),string);
}

- (void)test1:(NSString *)string
{
    
    NSLog(@"我是+++++test1 %@ %@",NSStringFromSelector(_cmd),string);
}
- (void)test2:(NSString *)string
{
    NSLog(@"我是-----test2 %@ %@",NSStringFromSelector(_cmd),string);
}
- (NSString *)description
{
    NSMutableString *string = [NSMutableString stringWithFormat:@"<%@: %p>\n{",[self class],self];
    Class c = self.class;
    // 截取类和父类的成员变量
    while (c && c != [NSObject class])
    {
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList(c, &count);
        for (int i = 0; i < count; i++)
        {
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
            [string appendFormat:@"\n%@:%@ ",key,[self valueForKeyPath:key]];
        }
        // 获得c的父类
        c = [c superclass];
        free(ivars);
    }
    [string appendFormat:@"\n}"];
    return string;
}
@end



对应的输出结果:
2015-08-05 13:35:29.565 Runtime_Nscoding[5343:161381] 我是-----test2 test1: test1
2015-08-05 13:35:29.566 Runtime_Nscoding[5343:161381] 我是+++++test1 test2: test2

情况2 通过分类(类目)给类动态的添加属性

我们知道catalogue可以给一个类添加方法,但是添加属性的话默认的情况下是不可以的。但是我们可以通过运行时的方法给一个类添加属性示例代码如下:
Person+More.h
//
//  Person+More.h
//  Runtime_Nscoding
//
//  Created by 杨小兵 on 15/8/5.
//  Copyright (c) 2015年 杨小兵. All rights reserved.
//

#import "Person.h"
/**
 *  动态的添加属性
 */
@interface Person (More)

/**
 *  为每一个对象添加一个name属性
 */
@property (nonatomic,copy) NSString *bookName;
/**
 *  为每个对象添加一个数组属性
 */
@property (nonatomic,strong) NSArray *books;
@end

//
//  Person+More.m
//  Runtime_Nscoding
//
//  Created by 杨小兵 on 15/8/5.
//  Copyright (c) 2015年 杨小兵. All rights reserved.
//

#import "Person+More.h"
#import <objc/runtime.h>

@implementation Person (More)
// 用一个字节来存储key值,设置为静态私有变量,避免外界修改
static char bookNameKey;
- (void)setBookName:(NSString *)bookName
{
    
    // 将某个值与某个对象关联起来,将某个值存储到某个对象中
        objc_setAssociatedObject(self, &bookNameKey, bookName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)bookName
{
    return objc_getAssociatedObject(self, &bookNameKey);
}

static char booksKey;
- (void)setBooks:(NSArray *)books
{
    objc_setAssociatedObject(self, &booksKey, books, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSArray *)books
{
    return objc_getAssociatedObject(self, &booksKey);
}

@end

这样的话就活增加两个属性
    Person *person = [[Person alloc] init];
    person.bookName = @"book";
    person.books = @[@"book1",@"book2"];
    NSLog(@"%@,%@",person.bookName,person.books);

2015-08-05 14:18:35.930 Runtime_Nscoding[5736:192376] *******<Studet: 0x7fda6b70eba0>
{
_studyAge:一年级 
_name:name 
_age:12 
}



情况3 利用运行时实现NSCoding协议

我们可以再程序运行的时候动态获取对象的方法列表和属性列表,这样的话我们就可以利用属性列表动态的实现NSCoding协议,而不用每个属性都自己去写具体的实现代码如下:
//
//  Person.m
//  Runtime_Nscoding
//
//  Created by 杨小兵 on 15/8/5.
//  Copyright (c) 2015年 杨小兵. All rights reserved.
//

#import "Person.h"
#import <objc/runtime.h>

@implementation Person
- (id)initWithCoder:(NSCoder *)aDecoder
{
    
    if (self = [super init]) {
        Class c = self.class;
        // 截取类和父类的成员变量
        while (c && c != [NSObject class]) {
            unsigned int count = 0;
            Ivar *ivars = class_copyIvarList(c, &count);
            for (int i = 0; i < count; i++) {
                
                NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
                
                id value = [aDecoder decodeObjectForKey:key];
                
                [self setValue:value forKey:key];
                
            }
            // 获得c的父类
            c = [c superclass];
            free(ivars);
        }
        
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    
    
    Class c = self.class;
    // 截取类和父类的成员变量
    while (c && c != [NSObject class]) {
        unsigned int count = 0;
        
        Ivar *ivars = class_copyIvarList(c, &count);
        
        for (int i = 0; i < count; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
            
            id value = [self valueForKey:key];
            
            [aCoder encodeObject:value forKey:key];
        }
        c = [c superclass];
        // 释放内存
        free(ivars);
    }
}
@end


然后我们又写了一个类 Student继承自Person
//
//  Studet.h
//  Runtime_Nscoding
//
//  Created by 杨小兵 on 15/8/5.
//  Copyright (c) 2015年 杨小兵. All rights reserved.
//

#import "Person.h"

@interface Studet : Person
/**
 *  年级
 */
@property(nonatomic , copy)NSString *studyAge;
- (void)test1:(NSString *)string;
- (void)test2:(NSString *)string;
@end
Person的.m文件的源码在情况一里边已经贴出来了,可以看出来里边没有实现NScoding,所以应该是调用Person的相关方法,程序依然可以完美的运行
Studet *stu = [[Studet alloc]init];
    stu.name = @"name";
    stu.age = 12;
    stu.studyAge = @"一年级";
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //将对象归档
    path = [NSString stringWithFormat:@"%@/stu.data",path];
    [NSKeyedArchiver archiveRootObject:stu toFile:path];
    //将对象解档
    Studet *stu2 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@",stu2);

输出结果如下:
2015-08-05 14:18:35.930 Runtime_Nscoding[5736:192376] *******<Studet: 0x7fda6b70eba0>
{
_studyAge:一年级 
_name:name 
_age:12 
}

情况4动态的提那家方法

我这里仅动态的添加了一个有参函数和无参函数其代码实现如下
#pragma mark- 动态的添加了一个方法

/**
 *  动态的添加的方法
 *
 */
void  newFunction1(__strong id self, SEL _cmd){
    NSLog(@"%@  是动态添加的方法", [self name]);
}
void  newFunction2(__strong id self, SEL _cmd ,NSString *conten){
    NSLog(@"%@  是动态添加的方法,参数是 %@", [self name],conten);
}
//动态添加方法:在resolve中添加相应的方法,注意是类方法还是对象方法。
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if ([NSStringFromSelector(sel) isEqualToString:@"newFunction1"])
    {
        class_addMethod(self, sel, (IMP)newFunction1, "v@:"); // 为sel指定实现为newFunction1
        return YES;
    }
    if ([NSStringFromSelector(sel) isEqualToString:@"newFunction2:"])
    {
        class_addMethod(self, sel, (IMP)newFunction2, "v@:@"); // 为sel指定实现为newFunction2
        return YES;
    }
    return YES;
}


#pragma mark - 类方法
void  newFunction(__strong id self, SEL _cmd){
    NSLog(@"%@  是动态添加的方法#########################", [self class]);
}
+ (BOOL)resolveClassMethod:(SEL)sel
{
    if ([NSStringFromSelector(sel) isEqualToString:@"newFunction"])
    {
        class_addMethod(self, sel, (IMP)newFunction, "v@:"); // 为sel指定实现为newFunction
        return YES;
    }
    return YES;
}

调用的代码如下
- (void)test3
{
    
//    [Student  methodForSelector:("newFunction")];
    Student * student = [[Student alloc] init];
    
    student.name = @"test3";
    
    [student performSelector:@selector(newFunction1)];
    [student performSelector:@selector(newFunction2:) withObject:@"world"];
    
}

其输出效果如下
2015-08-05 16:45:42.285 Runtime_Nscoding[9980:303931] 我是-----test2 test1: test1
2015-08-05 16:45:42.285 Runtime_Nscoding[9980:303931] 我是+++++test1 test2: test2
2015-08-05 16:45:42.286 Runtime_Nscoding[9980:303931] test3  是动态添加的方法
2015-08-05 16:45:42.286 Runtime_Nscoding[9980:303931] test3  是动态添加的方法,参数是 world
现在有一个缺点就是类方法知道如何添加但是不知道如何调用

本博文的实例代码链接  https://github.com/sixTiger/Runtime_Nscoding

光模块封装工艺简介 光模块按照部件可以分为芯片、光器件、光模块三个层级;按照应用领域大概可分为电信应用、数通应用两个领域;按照内部器件的封装工艺可分为TO、Box、COB三大类。 但是,无论是哪种类型的光模块,其生产工艺基本上可以分为封装、测试两大块。   那什么叫做器件封装呢?我的理解器件封装就是利用胶水、焊料、机械、热量等手段把器件按照一定的先后次序结合形成一个整体的过程,就好像早上吃的煎饼,把面粉、鸡蛋、脆饼、烤肠、葱花等这些“器件”,按照一定的顺序,通过食用油、甜面酱、加热、卷起来等手段结合到一起,形成了美味的 阅读详情

相关推荐

液态神经网络系列(四) | 一条 PyTorch 从零搭建 LTC 细胞

本文详细介绍了如何从零开始用PyTorch实现Liquid Time-constant Networks(LTC)神经元模型。首先将LTC的核心微分方程拆解为输入电导、系统时间常数和数值积分器三个模块,然后逐步构建LTCCell类,包括物理参数初始化、突触参数设置和前向演化过程。文章还展示了如何封装LTCModel处理不规则时间序列,并通过正弦波抗干扰实验验证了LTC模型的优越性。最后讨论了数值稳定性、计算代价等实现细节,并预告了下一篇将探讨使用伴随灵敏度算法优化显存占用的方法。

wyj333333的博客 2067

Verdin AM62使用CODESYS

CODESYS 是基于 IEC 61131-3 的 PLC 开发工具,在工业控制、交通等领域中有着广泛的应用。文章将介绍如何在 Toradex 采用 TI AM62 SoC 的 Arm 计算机模块 Verdin AM62 使用评估版本的 CODESYS。使用 TI AM623/AM625 处理器,具有最多 4 个主频 1.4GHz 的 Cortex-A53 内核,以及一个 400MHz 主频的 M4F 核心。内存采用 LPDDR4,从 512 MB 到 2 GB 可供选择。eMMC 从 4~16 GB。

toradexsh的博客 1125

从零到一:Mx_yolo本地训练与K210部署实战指南

本文详细介绍了从零开始进行Mx_yolo本地模型训练到K210部署的全流程实战指南。涵盖环境配置、数据准备、模型训练与调优、模型转换及K210部署等关键步骤,并提供了常见问题解决方案和性能优化技巧,帮助开发者高效完成AI模型在嵌入式设备的落地应用。

weixin_29081163的博客 252

linux下runtime文件夹什么用,走进docker(04):什么是容器的runtime?

我们都知道runc是容器runtime的一个实现,那到底什么是runtime?包含了哪些内容?容器的runtime和image一样,也有标准,也由OCI (Open Containers Initiative)负责维护,地址为Runtime Specification,了解runtime标准有利于我们更好的理解docker和runc的关系,本文将对该标准做一个简单的解释。规范内容下面分别介绍这些规...

weixin_35647799的博客 848

IEEE论文投稿必看:PDF eXpress报错font not embedded的3种修复方法(附Adobe Acrobat DC操作截图)

本文针对IEEE论文投稿时PDF eXpress系统常见的“font not embedded”报错,提供了三种核心修复方案。首先,详细解析了使用Adobe Acrobat DC进行专业修复的完整操作流程与关键技巧。其次,介绍了无需付费软件的开源与免费工具链(如Ghostscript)解决方案。最后,从源头出发,指导LaTeX和Microsoft Word用户在生成PDF时正确设置以确保字体自动嵌入,帮助研究者彻底解决格式问题,确保投稿顺利。

ujm56789012的博客 516

Vlan的封装模式和端口讲解(Access、Trunk、Hypbrid端口)

Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域,在交换机上实现广播域隔离(增强局域网的安全性、限制广播风暴、简化网络管理)Vlan通过将二层数据帧打上Vlan标签(打上Vlan标签也就是封装Vlan),正常情况下,不同Vlan Tag的数据包是无法二层直接互访的,以此来实现广播域的隔离可以理解为一个Vlan对应一个广播域,同一Vlan内的主机可以二层直接通信,不同Vlan间的主机无法二层直接通信。

m0_49864110的博客 5643

Linux Runtime PM介绍

一、Runtime PM引言 1. 背景 (1)display的需求 (2)系统整机动态功耗优化的需求 (3)upstream 2. 解决方案 (1)引入debounce (2)使用统一的workqueue来管理任务 (3)实时地关闭不需要工作的device (4)当device作为parent时,所有的child不工作时,关闭该device (5)引入pm_rutim

撒哈拉的绿洲 1万+

【Claude Code】Not logged in 未登录错误解决方案 + /login 认证路径

Claude Code 启动时提示 Not logged in 表示当前会话缺少有效凭证。本文从环境变量、API Key 配置、CI 自动化凭证脚本和系统时钟四个维度,提供完整的认证排查流程与修复方案。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 894

Runtime源码解析和实战使用

文章目录Runtime-源码分析类的结构体对象的初始化消息的发送机制objc_msgSend 工作原理消息转发机制实战使用Runtime 为类别动态添加属性类的属性实现原理类别中直接添加属性剖析使用runtime 为类别添加属性Runtime 实现方法交换Method Swizzle 实现的原理Methoad swizzle 实现代码 Runtime-源码分析 1.类的初始化 在外部是如何实现的...

Abe_liu的博客 1497

UG NX二次开发-博客文章速览

写了一些UG NX二次开发的心得体会,内容较多,感觉不好查找相应的内容,所以决心把导航写出来,方便自己也方便读者。主专栏是“”,C#专栏为 : “” ,Python专栏为 : “这三个专栏都会持续的更新。如果有需要咨询或者学习讨论的,请私信博主或者加QQ群:749492565。博主几乎每天都在。

GimiGimmy 3714

风光储并网对电力系统稳定性影响的仿真研究

本文研究了风光储并网对电力系统稳定性的影响,基于MATLAB/Simulink平台搭建了IEEE 9节点测试系统的风光储并网模型。研究对比了光储、风储和风光储三种并网配置在多种干扰下的稳定性表现。结果表明:光储系统对频率变化最敏感,风储系统具有更强的功率波动适应能力,而风光储联合系统通过互补效应展现出最佳综合稳定性。储能系统在所有配置中均显著改善了频率恢复性能,验证了其在新能源并网中的关键支撑作用。研究为高比例可再生能源电力系统的稳定运行提供了仿真依据和技术参考。

huanghm88的专栏 154

runtime(1) - 消息发送机制

1、消息发送机制 1、[ ]发送消息 2、将[ ]发送消息转换为cpp代码 //在命令行输入此命令即可 clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs...

swel的博客 269

数仓解惑:数据仓库常见建模方法与大数据领域建模实例综述

为什么需要数据建模? 为什么要进行数据仓库建模? 随着DT时代互联网、智能设备等信息技术的发展,数据开始井喷式的增长,如何讲这些数据进行有序、有结构地分类组织存储是我们面临的一个挑战。 如果把数据看作图书馆里的书,我们希望看到它们在书架上分门别类地放置,而不是乱糟糟的 大数据的数仓建模是通过建模的方法更好的组织、存储数据,以便在 性能、成本、效率和数据质量之间找到最佳平衡点。一般主要从下面四点考虑 ...

云祁QI 5850

.NET Runtime System.Runtime:运行时服务深度解析

还在为.NET应用程序的性能优化和内存管理头疼吗?是否曾经困惑于CLR(Common Language Runtime,公共语言运行时)如何高效执行托管代码?System.Runtime作为.NET运行时服务的核心组件,提供了应用程序与底层运行时环境交互的关键接口。本文将深入解析System.Runtime的核心功能、最佳实践和性能优化技巧。 通过阅读本文,您将获得: - System.Runt...

gitblog_00571的博客 1246

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

浅谈Runtime运行时

runtime runtime又叫运行时,是一套底层的c语言api,其为iOS内部核心之一。OC是动态运行时语言,它会将一些工作放在代码运行时去处理,而非编译时,比如动态的遍历属性和方法,动态的添加属性和方法,动态的修改属性和方法等。 了解runtime,首先要先了解它的核心--消息传递。 消息传递 消息直到运行时才会与方法实践绑定起来。 一个实例对象调用实例方法,像这样[obj doSometh...

架构师亮哥的博客 905

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

详解Runtime运行时机制

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message:(id)arg...]; // 底

銟麯的博客 7379

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Runtime运行时机制

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message:(id)arg...]; // 底

guojigang8963869的博客 1713

Docker 容器运行时runtime

容器核心技术 容器核心技术是指能够让 container 在 host 上运行起来的那些技术。 这些技术包括容器规范、容器 runtime、容器管理工具、容器定义工具、Registry 以及 容器 OS,下面分别介绍。 容器规范 容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI).

小楼一夜听春雨,深巷明朝卖杏花 6487

runtime 运行时

Objective-C Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。 Objective-C 是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象、进行消息传递和转发...

bangchang5197的博客 139

OC runtime 运行时详解

一、简介 1.1 什么是Runtime Runtime是一套底层纯C语言API,我们编写的OC代码最终都会被编译器转化为运行时代码,通过消息机制决定函数调用方式,这也是OC作为动态语言使用的基础。 1.2 消息机制的基本原理 在Object-C的语言中,对象方法调用都是类似[receiver selector] 的形式,其本质:就是让对象在运行时发送消息的过程。 而方法调用[receiver selector]分为两个过程: 编译阶段 [receiver selector] 方法被编译器转化,分为.

Rey的技术博客 1446

k8s的容器运行时(Container Runtime)解析

容器运行时(Container Runtime)是 Kubernetes 集群中负责管理和执行容器的核心组件,它实现了对容器生命周期的控制,包括创建、启动、停止、删除以及资源隔离、网络配置、存储挂载等功能。在Kubernetes环境中,容器运行时通过遵循Kubernetes定义的Container Runtime Interface (CRI) 来与kubelet(节点代理)交互,确保容器能够在节点上按照Kubernetes的调度和管理要求运行。

专注于数据库技术分享,包含但不限于Oracle,MySQL,PostgreSQL,ElasticSearch及国产数据库等 2608

CANN Runtime 运行时文档

<h1 align="center">CANN Runtime</h1> <p align="center"> <b>昇腾 AI 处理器轻量级运行时环境 · 端云一致 · 高性能推理</b><br> CANN Runtime 是昇腾 AI 处理器的核心运行时底座,它通过提供统一的API,使得上层应用、AI框架、加速库能够高效利用AI处理器的硬件计算资源。 </p> --- <!--

gitblog_00997的博客 1119

Runtime Unity Editor:Unity游戏运行时调试工具技术解析

Runtime Unity Editor是一款专为Unity游戏引擎设计的内嵌式运行时编辑器和调试工具,为游戏开发者和mod制作者提供实时的游戏对象检查和修改能力。该工具通过无缝集成到游戏运行时环境,让开发者能够深入洞察游戏内部运作,快速定位和修复问题。 ## 技术架构解析 Runtime Unity Editor采用模块化设计,支持多种Unity版本和运行时环境。项目包含多个核心组件,分别针

gitblog_00956的博客 1191

DyberPet 桌宠框架:3 步启动桌面宠物,养成与任务系统完整拆解

DyberPet(呆啵宠物)是基于 PySide6 打造的开源桌面宠物框架,把动画、交互、养成、任务与商店装进一套完整 App,而不只是 GIF 播放器;AI 对话是可选加分项,不是前置条件。当前版本 v0.8.5。 ## DyberPet 源码安装与启动步骤 Windows 用户可直接从 Release 下载打包好的 EXE 双击运行,跳过以下全部步骤;源码用户按三步走。 **步骤 1:获

gitblog_00667的博客 1696

编程环境中Runtime(运行时)的三个含义

编程环境中Runtime(运行时)的三个含义 转自:https://www.zhihu.com/question/20607178 知乎答主@doodlewind 三个含义 实际上编程语境中的 runtime 至少有三个含义,分别是: 指「程序运行的时候」,即程序生命周期中的一个阶段。例句:「Rust 比 C 更容易将错误发现在编译时而非运行时。」 指「运行时库」,即 glibc 这类原生语言的标准库。例句:「C 程序的 malloc 函数实现需要由运行时提供。」 指「运行时系统」,即某门语言的宿主环境。

weixin_44966641的博客 7559

运行时架构(Runtime Architecture)

运行时系统是Objective-C平台的关键元素,它实现了语言的动态特点和面向对象的能力。它的结构能让你开发代码时不用接触到运行时的内部,但是提供了一个公共的API,让你写代码直接激活运行时服务。下面,我们来探索下运行时系统的架构和设计以及它如何实现动态特点的。你将学习运行时的主要组件,关键的实现细节,然后研究下你的代码在编译和运行期间是如何与运行时进行交互的。运行时组件(Runtime Compo

WflytoC的博客 2526
上一篇: NSThread 售票员售票问题
下一篇: iOS跳转到具体某个应用的设置
杨小兵
博客等级 码龄14年 11粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值