Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Runtime 创建动态一个类 添加成员变量 属性

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

作者头像
星宇大前端
发布于 2019-01-15 07:02:00
发布于 2019-01-15 07:02:00
1.7K00
代码可运行
举报
文章被收录于专栏:大宇笔记大宇笔记
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
Tips:苹果公开的源代码在这里可以查,https://opensource.apple.com/tarballs/
陈满iOS
2018/09/10
1.8K1
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
Objective-C Runtime:深入理解成员变量与属性
在上篇文章Objective-C Runtime:深入理解类与对象中,讲解了类与对象的相关内容。
Jacklin999
2018/09/12
8310
RunTime 之常规操作
有关Runtime的知识总结,我本来想集中写成一篇文章的,但是最后发现实在是太长,而且不利于阅读,最后分成了如下几篇:
進无尽
2018/09/12
6320
RunTime 之常规操作
深入浅出 Runtime(一):初识
对于 NSString *string = [[NSMutableArray alloc]init];
师大小海腾
2020/04/16
1.1K0
NSObject头文件解析 / 消息机制 / Runtime解读 (一)
上面是NSObject对象的头文件类部分, 可以看到还有一个NSObject protocol 我们也仔细看看都有什么协议方法@protocol NSObjec
周希
2019/10/15
1.3K0
Runtime系列(二)--Runtime的使用场景
Runtime 理解介绍的文章非常多,我只想讲讲Runtime 可以用在哪里,而我在项目里哪些地方用到了runtime。多以实际使用过程为主,来介绍runtime的使用。
Haley_Wong
2018/08/22
1.7K1
Runtime系列(二)--Runtime的使用场景
KVO简单使用及其实现原理
在应用开发中,我们经常需要使用到,观察者模式,能监听某些对象属性的变化,进行相应的操作。在iOS中,OC为我们提供了一套更加简洁优雅的观察方式——KVO。
Oceanlong
2018/09/21
1.4K0
NSObject头文件解析 / 消息机制 / Runtime解读 (二)
const char *name; /**< The name of the attribute */
周希
2019/10/15
6020
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
7510
iOS 知识点回顾(二)
温故而知新 目录 Runtime 消息发送机制 isMemberOfClass 和 isKindOfClass Super 和 Self @synthesize/@dynamic RunLoop 线程和进程 什么是优先级反转自旋锁、互斥锁比较 1. Runtime OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行;OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数;平时编写的OC代码,底层都是转换成了Runtime API
且行且珍惜_iOS
2020/01/02
4920
iOS Runtime 简单介绍,以及不同类的 Method Swizzling
runtime 顾名思义就是运行时,其实我们的 App 从你按下 command+R 开始一直到 App 运行起来经历了大致两个阶段,1:编译时,2:运行时。还记得一道很经典的面试题
molier
2022/11/03
6640
iOS Runtime 简单介绍,以及不同类的 Method Swizzling
Objc Runtime 总结
Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。Runtime是C和汇编编写的,这里http://www.opensource.apple.com/source/objc4/可以下到苹果维护的开源代码,GNU也有一个开源的runtime版本,他们都努力的保持一致。苹果官方的Runtime编程指南
用户7451029
2020/06/16
8470
iOS底层原理总结 - 探寻Runtime本质(四)
首先来看一道面试题。 下列代码中Person继承自NSObject,Student继承自Person,写出下列代码输出内容。
xx_Cc
2018/08/02
9520
iOS底层原理总结 - 探寻Runtime本质(四)
[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详解》中我们探讨了Runtime的基本原理,这篇文章我们将总结一下Runtime的一些基本使用 目录 查询方法 给分类添加属性 更换代码的实现方法 动态添加方法 字典转属性 先创建两个类 ClassA.h #import <Foundation/Foundation.h> @interface ClassA : NSObject { // 公有变量 NSString *_publicVar1; NSString *_publ
BY
2018/05/11
1.2K0
iOS底层学习——KVC下篇
除了对当前对象的属性进行赋值外,还可以对其更深层的对象进行赋值。例如,对当前对象的location属性的country属性进行赋值。KVC进行多级访问时,直接类似于属性调用一样用点语法进行访问即可。
CC老师
2021/08/25
4920
Objective-C Runtime:深入理解类与对象
常说Objective-C是一门动态语言,那么问题来了,这个动态表现在那些方面呢?
Jacklin999
2018/09/12
1.4K0
Objective-C Runtime:深入理解类与对象
类的加载(二)
通过前面文章的介绍,我们已经对rw和ro之间的关系有过了解了,本篇文章首先通过一个面试题来加深下诸位对ro和rw的理解,也进一步熟悉下Runtime的API。
拉维
2021/03/10
6410
类的加载(二)
iOS运行时(4)——常用函数
1 类 1.1 创建对象 id class_createInstance(Class cls, size_t extraBytes) eg: size_t size = class_getInstanceSize([Person class]); Person *person = class_createInstance([Person class], size); 1.2 获取类名 const char *class_getName(Class cls) eg const char *name = c
羊羽shine
2019/05/29
6030
OC中Runtime浅析
最近了解了一下OC的Runtime,真的是OC中很强大的一个机制,看起来比较底层,但其实可以有很多活用的方式。
Cloudox
2021/11/23
2920
OC中Runtime浅析
相关推荐
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
更多 >
LV.1
Pansoft大前端架构
交个朋友
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验