运行时。。::分类并不是不可以扩充成员变量,可以用运行时机制动态添加成员变量

运行时机制是纯C语言,平时写得OC代码最终都要转成C运行时代码

@property在category中只能实现get,set方法的声明,不能实现方法的实现

#import <objc/message.h>

objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

static int heightKey;

代码如下:

//  Person.h

//  运行时机制

//

//  Created by 殷婷婷 on 15-6-10.

//  Copyright (c) 2015年 lanou. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic,assign)int age;

@end

#import "Person.h"

@implementation Person

@end

#import "Person.h"

@interface Person (YTT)

@property(nonatomic,assign)double height;

@end

@implementation Person (YTT)

static double heightKey;

- (void)setHeight:(double)height{

objc_setAssociatedObject(self, &heightKey, @(height), OBJC_ASSOCIATION_ASSIGN); //会把height的值赋值到heightKey里

}

- (double)height{

return [objc_getAssociatedObject(self, &heightKey) doubleValue];

}

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Person+YTT.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

Person *p = [[Person alloc]init];

p.height = 30;

NSLog(@"%d",p.age);

NSLog(@"%f",p.height);

}

return 0;

}

结果:

2015-06-10 19:30:37.743 运行时机制[5631:303] 0

2015-06-10 19:30:37.744 运行时机制[5631:303] 30.000000

Program ended with exit code: 0

========================遍历成员变量===========================

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic,assign)int age;

@property(nonatomic,copy)NSString *name;

@end

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Person+YTT.h"

#import <objc/runtime.h>

int main(int argc, const char * argv[]) {

@autoreleasepool {

unsigned  int count = 0;

//获得Person类中的所有成员变量

Ivar *ivars =   class_copyIvarList([Person class], &count);

//遍历所有成员变量

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

Ivar ivar = ivars[i];

const char *name = ivar_getName(ivar);

const char *type = ivar_getTypeEncoding(ivar);

NSLog(@"%s,%s",name,type);

}

2015-06-10 19:48:39.229 运行时机制[5704:303] _age,i

2015-06-10 19:48:39.231 运行时机制[5704:303] _name,@"NSString"

 

class_copyIvarList(<#__unsafe_unretained Class cls#>, <#unsigned int *outCount#>)

时间: 2024-10-22 18:04:28

运行时。。::分类并不是不可以扩充成员变量,可以用运行时机制动态添加成员变量的相关文章

运行时机制之为分类扩充成员变量

前言 用法 一.前言 在iOS开发过程当中,我们非常喜欢使用分类,但是有时候,我们想给我们分类添加成员变量,却无可奈何,今天就简单的给出一个小例子:为我们的分类增加成员变量的方法 二.用法 #import "UIImageView+Extersion.h" #import <objc/message.h> @interface UIImageView (_Extersion) @property (nonatomic, assign) double height; @end

ART运行时Foreground GC和Background GC切换过程分析

通过前面一系列文章的学习,我们知道了ART运行时既支持Mark-Sweep GC,又支持Compacting GC.其中,Mark-Sweep GC执行效率更高,但是存在内存碎片问题:而Compacting GC执行效率较低,但是不存在内存碎片问题.ART运行时通过引入Foreground GC和Background GC的概念来对这两种GC进行扬长避短.本文就详细分析它们的执行过程以及切换过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在前面AR

浅谈 F# 2.0 的两个运行时

我们知道,F# 2.0 有面向 .NET Framework 2.0 和 .NET Framework 4 的两个运行时.此外,F# 2.0 还有一个面向 Silverlight 的运行时. 面向 .NET Framework 2.0 的 F# 2.0 运行时的核心库 (FSharp.Core.dll) 将一些 API 包含在 System 命名空间中,这些 API 与 F# 开发所需的 .NET Framework 4 API 相同.例如 System.Numerics.BigInteger

iOS 运行时(runtime)浅析

本博客,直接从分类说起.都知道OC中的分类是不能直接添加属性的,意思间接是能添加属性的.那应该怎么添加呢?那就要用到运行时(runtime)机制. 一,运行时金典用法之一 现在,给HGPerson类增加一个分类:HGPerson+HG.h,给一个属性如下: @property (nonatomic, copy) NSString* name; 貌似,这样写了以后,是能调用的,但是运行就报错了. -[HGPerson setName:]: unrecognized selector sent to

Runtime 运行时:类与对象

Runtime 运行时:类与对象 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Ru

iOS 运行时RunTime使用场景一:打点统计用户行为,深度解耦

转自:http://www.jianshu.com/p/0497afdad36d 用户统计.jpeg 用户行为统计(User Behavior Statistics, UBS)一直是移动互联网产品中必不可少的环节,也俗称埋点.在保证移动端流量不会受较大影响的前提下,PM们总是希望埋点覆盖面越广越好.目前常规的做法是将埋点代码封装成工具类,但凡工程中需要埋点(如点击事件.页面跳转)的地方都插入埋点代码.一旦项目越来越复杂,你会发现埋点的代码散落在程序的各个角落,不利于维护以及复用.本文旨在探讨利用

IOS 运行时(runtime)机制

1. 概述 OC 是一个全动态语言,OC 的一切都是基于 Runtime 实现的 只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法` 2. 运行时机制 运行时机制是用 C++ 开发的,是一套苹果开源的框架 OC 是基于运行时开发的语言 3. 应用场景 运行时动态获取类的属性 主要应用: 字典转模型框架 MJExtension,JSONModel 利用 关联对象 为分类添加属性 利用 交换方法 拦截系统或其他框架的方法 误区:并不是使用的技术越底层,框架的效率就会越高 导入头文件

iOS运行时 runtime

1.运行时介绍 1. 什么是运行时 运行时机制是用 C++开发的,是一套苹果开源的框架 OC 是基于运行时开发的语言,在OC中所有的类都是运行的时候才加载. 2. OC语言 OC 是一个全动态语言,OC的一切都是基于 Runtime实现的 只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法 3. 使用场景 1. 运行时动态获取类的属性 //主要应用:字典转模型框架 MJExtension,JSONModel 2.利用关联对象为分类添加属性 3.利用交换方法拦截系统或其他框架的方法

Object-C 类,对象,运行时,isa 附带类本质的内存图

如果不是Apple,不是App Store,Object-C恐怕早就淡出人们的视线了.大部分编程语言都是基于C语法风格的,所以初次接触这个非C风格的语言,会看不懂它那怪异的语法.但如果掌握了它之后,也并不会觉得它又太多的不同.今天记录一下它的底层运作.       1: 类Class:       typedef struct objc_class * Class;     从Class的定义可以看出,它是一个 objc_class 结构类型的指针,objc_class又是什么呢? struct