首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Runtime 创建动态一个类 添加成员变量 属性

Runtime 创建动态一个类 添加成员变量 属性

作者头像
星宇大前端
发布于 2019-01-15 07:02:00
发布于 2019-01-15 07:02:00
1.8K00
代码可运行
举报
文章被收录于专栏:大宇笔记大宇笔记
运行总次数:0
代码可运行

序:

这篇文章主要介绍OC Runtime怎么动态创建类,添加成员变量,添加属性,对象动态绑定keyValue,添加方法。 (主要介绍成员变量和属性) 对于概念还不理解的可以看之前的博客。代码说的再多不如自己写一遍,写过之后肯定有不同的理解。好脑子不如烂笔头,没有什么概念要说的,代码里有注释,下面直接上代码。

Demo地址:https://github.com/RainManGO/RuntimeVarDemo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
//  ViewController.m
//  Runtime动态创建基础详解
//
//  Created by apple on 2017/7/14.
//  Copyright © 2017年 ZY. All rights reserved.
//

#import "ViewController.h"
#import <objc/runtime.h>
@interface ViewController ()

@end

@implementation ViewController

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

-(void)creatHeroClass{
    /*  创建类
     *  参数1 父类  参数二 类名 参数3关于内存默认
     */
    Class  Hero = objc_allocateClassPair([NSObject class], "Hero", 0);
    
    class_addMethod(Hero, @selector(R:), (IMP)R, "@@:@");//添加方法
    
    class_addIvar(Hero, "Q", sizeof(NSString *), 0, "@");//添加成员变量
    class_addIvar(Hero, "W", sizeof(NSString *), 0, "@");//添加成员变量
    
    //添加属性实现setter  getter方法
    class_addMethod(Hero, @selector(setW:), (IMP)setW, "v@:@");
    class_addMethod(Hero, @selector(getW), (IMP)getW, "@@:");
    
    //注册类
    objc_registerClassPair(Hero);
    
    //实例化应用
    id hanbing = [[Hero alloc]init];
    
    //objc_setAssociatedObject 绑定key  value
    objc_setAssociatedObject(hanbing, @"beidong", @"寒冰的被动", OBJC_ASSOCIATION_COPY);
    NSLog(@"%@",objc_getAssociatedObject(hanbing, @"beidong"));
    
    //通过kvc设置上面定义的成员变量
    [hanbing setValue:@"寒冰射手的Q" forKey:@"Q"];
    
    [hanbing setW:@"寒冰的w"];
    NSLog(@"%@",[hanbing getW]);
    
    //类的属性
    objc_property_attribute_t type = { "T", "@\"NSString\"" };
    objc_property_attribute_t ownership = { "C", "" }; // C = copy
    objc_property_attribute_t backingivar  = { "V", "E" };
    objc_property_attribute_t attrs[] = { type, ownership, backingivar };
    class_addProperty(Hero, "E", attrs, 3);
    
    //遍历属性查看
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([Hero class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        fprintf(stdout, "Hero %s : %s\n", property_getName(property), property_getAttributes(property));
    }
    
    [hanbing R:@"德玛西亚"];
}

#pragma mark  OC方法

//OC方法不会调用,但是必须得写。实际调用IMP针织实现。
-(void)setW:(NSString *)w{
    
}

-(NSString *)getW{
    return nil;
}

-(NSString *)R:(NSString *)emery{
    
    return nil;
}

#pragma mark  IMP方法

void setW(id self,SEL cmd,NSString * str){
    Ivar  w = class_getInstanceVariable([self class], "W");
    NSString * oldW = object_getIvar(self, w);
    if (oldW!=str) {
        object_setIvar(self, w, [str copy]);
    }
}

NSString * getW(id self,SEL cmd){
    Ivar  w = class_getInstanceVariable([self class], "W");
    return object_getIvar(self, w);
}

id R(id self,SEL cmd,id emery){
    Ivar v  = class_getInstanceVariable([self class], "Q");
    NSString * vStr = object_getIvar(self, v);
    NSString * result = [NSString stringWithFormat:@"%@R死了%@",vStr,emery];
    NSLog(@"%@", result);
    return [NSString stringWithFormat:@"R死了%@",emery];
}

@end
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年07月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Objective-C Runtime] 成员变量与属性
在上篇文章[Objective-C Runtime] 类与对象详细讲解了Runtime机制对于类和对象相关处理,今天继续讲解一下Runtime在成员变量和属性上的处理方法和策略。 成员变量(Ivar)的数据结构 在Objective-C中,成员变量即Ivar类型,是指向结构体struct objc_ivar的指针,在Objc/runtime.h 中查到,如下所示: typedef struct objc_ivar *Ivar; 结构体struct objc_ivar的数据结构如下所示: struct o
Jacklin
2018/05/15
2.1K0
Objective-C Runtime:深入理解成员变量与属性
在上篇文章Objective-C Runtime:深入理解类与对象中,讲解了类与对象的相关内容。
Jacklin999
2018/09/12
8540
oc runtime
Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
conanma
2021/05/11
6440
Runtime系列(二)--Runtime的使用场景
Runtime 理解介绍的文章非常多,我只想讲讲Runtime 可以用在哪里,而我在项目里哪些地方用到了runtime。多以实际使用过程为主,来介绍runtime的使用。
Haley_Wong
2018/08/22
1.7K1
Runtime系列(二)--Runtime的使用场景
深入浅出 Runtime(一):初识
对于 NSString *string = [[NSMutableArray alloc]init];
师大小海腾
2020/04/16
1.1K0
iOS底层原理总结 - 探寻Runtime本质(四)
首先来看一道面试题。 下列代码中Person继承自NSObject,Student继承自Person,写出下列代码输出内容。
xx_Cc
2018/08/02
9680
iOS底层原理总结 - 探寻Runtime本质(四)
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
Tips:苹果公开的源代码在这里可以查,https://opensource.apple.com/tarballs/
陈满iOS
2018/09/10
1.9K1
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
Objc Runtime 总结
Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。Runtime是C和汇编编写的,这里http://www.opensource.apple.com/source/objc4/可以下到苹果维护的开源代码,GNU也有一个开源的runtime版本,他们都努力的保持一致。苹果官方的Runtime编程指南
用户7451029
2020/06/16
8650
RunTime 之常规操作
有关Runtime的知识总结,我本来想集中写成一篇文章的,但是最后发现实在是太长,而且不利于阅读,最后分成了如下几篇:
進无尽
2018/09/12
6490
RunTime 之常规操作
NSObject头文件解析 / 消息机制 / Runtime解读 (一)
上面是NSObject对象的头文件类部分, 可以看到还有一个NSObject protocol 我们也仔细看看都有什么协议方法@protocol NSObjec
周希
2019/10/15
1.3K0
Objective-C Runtime:深入理解类与对象
常说Objective-C是一门动态语言,那么问题来了,这个动态表现在那些方面呢?
Jacklin999
2018/09/12
1.4K0
Objective-C Runtime:深入理解类与对象
iOS开发--runtime常用API
1.objc_xxx 系列函数 objc_系列函数关注于宏观使用,如类与协议的空间分配,注册,注销等操作 objc_getClass 获取Class对象 objc_getMetaClass 获取MetaClass对象 objc_allocateClassPair 分配空间,创建类(仅在 创建之后,注册之前 能够添加成员变量) objc_registerClassPair 注册一个类(注册后方可使用该类创建对象) objc_disposeClassPair 注销某个类 objc_allocateProtoco
mukekeheart
2021/07/16
7560
KVO简单使用及其实现原理
在应用开发中,我们经常需要使用到,观察者模式,能监听某些对象属性的变化,进行相应的操作。在iOS中,OC为我们提供了一套更加简洁优雅的观察方式——KVO。
Oceanlong
2018/09/21
1.4K0
动态的Objective-C——关于消息机制与运行时的探讨
    Objective-C是一种很优美的语言,至少在我使用其进行编程的过程中,是很享受他那近乎自然语言的函数命名、灵活多样的方法调用方式以及配合IDE流顺畅快编写体验。Objective-C是扩展与C面向对象的编程语言,然而其方法的调用方式又和大多面向对象语言大有不同,其采用的是消息传递、转发的方式进行方法的调用。因此在Objective-C中对象的真正行为往往是在运行时确定而非在编译时确定,所以Objective-C又被称为是一种运行时的动态语言。
珲少
2018/08/15
8950
动态的Objective-C——关于消息机制与运行时的探讨
iOS 知识点回顾(二)
温故而知新 目录 Runtime 消息发送机制 isMemberOfClass 和 isKindOfClass Super 和 Self @synthesize/@dynamic RunLoop 线程和进程 什么是优先级反转自旋锁、互斥锁比较 1. Runtime OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行;OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数;平时编写的OC代码,底层都是转换成了Runtime API
且行且珍惜_iOS
2020/01/02
5070
Objective-C Runtime 的一些基本使用
在上一篇文章《Objective-C Runtime详解》中我们探讨了Runtime的基本原理,这篇文章我们将总结一下Runtime的一些基本使用 目录 查询方法 给分类添加属性 更换代码的实现方法 动态添加方法 字典转属性 先创建两个类 ClassA.h #import <Foundation/Foundation.h> @interface ClassA : NSObject { // 公有变量 NSString *_publicVar1; NSString *_publ
BY
2018/05/11
1.3K0
Runtime再理解
Objective-C、Java、Swift等高级语言,其可读性很强,但是并不能直接被机器识别,所以就需要将这些源代码编译成相对应的机器语言(比如汇编语言),最终会生成二进制代码。这就是编译时做的事情。
拉维
2019/10/24
6930
iOS运行时的应用:动态添加方法、属性关联
RuntimeKit对Runtime常用的方法进行了简单的封装。主要是动态的获取类的一些属性和方法的,以及动态方法添加和方法交换。
公众号iOS逆向
2021/07/29
1.2K0
Objective-C Runtime详解
Objective-C Runtime 最近在学习Runtime的知识,恰巧发现了这篇博客《Objective-C Runtime》,在此基础上,进行了些许补充说明,如有错误或其他想法,欢迎提出交流。 目录 引言 简介 与Runtime交互 RunTime术语 消息 动态方法解析 消息转发 健壮的实例变量 动态添加属性(Object-C Associated Objects) 方法调剂(Method Swizzling) 总结 引言 Objective-C的方法调用实则为“发送消息”,我们来看[dog
BY
2018/05/11
2.1K0
神奇的Runtime
[receiver message]不是一个简单地方法调用,而是在编译阶段被编译器转化为
Helloted
2022/06/06
7230
神奇的Runtime
相关推荐
[Objective-C Runtime] 成员变量与属性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档