iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行

一、Runtime的理解

  OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用!

二、类别(category)添加属性_使用前记得导入头文件#import <objc/runtime.h>

  通过这三个方法动态的绑定属性

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);//set方法
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);//get方法
OBJC_EXPORT void objc_removeAssociatedObjects(id object)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);//移除

  eg:

- (void)setName:(NSString *)name{

//    OBJC_ASSOCIATION_ASSIGN = 0,           //assign
//    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //retaion , nonatomic
//    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   //copy ,  nonatomic
//    OBJC_ASSOCIATION_RETAIN = 01401,       //retain
//    OBJC_ASSOCIATION_COPY = 01403          //copy
   /**
    实现set方法

    @param object#> self description#>
    @param key#> 属性的键值统一就行 description#>
    @param value#> 属性的值 description#>
    @param policy#> 和copy,retain,assign类似 description#>
    */
    objc_setAssociatedObject(self, nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

//定义常量 属性的键值统一
static char  *nameKey = "nameKey";

- (NSString *)name{
    /**
     实现get方法

     @param object#> 这是填self description#>
     @param key#> 属性的键值统一就行 description#>
     */
    return objc_getAssociatedObject(self, nameKey);

三、两个方法的执行替换

    SEL originalSelector = NSSelectorFromString(@"原来方法名");
    SEL swizzledSelector = NSSelectorFromString(@"需要替换的方法名");
    Method originalMethod = class_getInstanceMethod([self class], originalSelector);
    Method swizzledMethod = class_getInstanceMethod([self class], swizzledSelector);
    method_exchangeImplementations(originalMethod, swizzledMethod);

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e44448 }
span.s1 { color: #d28f5a }
span.s2 { }

时间: 2024-10-10 05:41:37

iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行的相关文章

iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639335 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

iOS动态性:动态添加属性的方法——关联(e.g. 向Category添加属性)

想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative References,这个问题就很容易解决了.这种方法也就是所谓的关联(association),我们可以在runtime期间动态地添加任意多的属性,并且随时读取.所用到的两个重要runtime API是: 1 OBJC_EXPORT void objc_setAssociatedObject(id

给category添加属性的方法

默认类别时无法添加属性的,但可以动态添加,利用runtime机制 #import static const void * externVariableKey =&externVariableKey; @implementation NSObject (Category) @dynamic variable: - (id) variable { return objc_getAssociatedObject(self, externVariableKey); } - (void)setVariab

为类目(类别)添加属性,使用storyboard设置边框颜色

通常使用Category时,只能添加方法,不可添加属性.但是在使用Storyboard时我们可能会使用到keyPath,这里设置的key都需要是所设置视图的属性值,并且类型有所限制. 例如:我现在有一个按钮,我想设置成圆角,并且是紫色边框.并且我不想写代码,想通过storyboard直接设置.这样看起来很帅(其实就是一个强迫症吧,因为一直在用sb设置整个界面,但是突然出现几个样式,在sb中不可以直接设置,这种感觉很烦躁的,所以要解决掉它). 遇到的问题:这里key path 的type类型是固定

iOS 使用 Runtime Attribute 为 IB 控件添加不能直接设置的属性

Runtime Attribute 是一个不被看重但功能非常强大的特性,它可以帮助你编写更加轻量级的ViewController. 1.在什么情况下使用 当你使用IB(Storyboard或者Xib)编辑视图的时候,有时可能会遇到诸如 圆角.边框.边框颜色.等等难以通过IB直接设置的属性. 这时你不得不借助代码实现.其实当出现这类情况时,我们其实可以借助Runtime Attribute在IB中实现. 2.如何使用 如图所示,在IB中,点击任意一个控件切换到identity inspector

python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名

>>> dir(__builtins__)['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarn

Category / Extention / 属性 / 成员变量 /

转载自:http://blog.csdn.net/itianyi/article/details/8618128 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @e

类别(category)

类别(category) 类别:类别是一种为现有的类添加新方法的方式.使用类别你可以为任何类添加新的方法,包括那些没有源代码的类. 通常会以"类名称+类别名称"的风格命名.这并不是硬性的规定,但却是一个好习惯.例如:NSString+NumberAsNSNumber. 类别的声明 #import <Foundation/Foundation.h> @interface NSString (NumberConvenience) -(NSNumber *) lenthAsNum

给分类(Category)添加属性

遇到一个问题,写了一个分类,但原先类的属性不够用.添加一个属性,调用的时候崩溃了,说是找不到getter.setter方法.查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter.setter方法.有没有解决方案呢?有,通过运行时建立关联引用.接下来以添加一个这样的属性为例: @property (nonatomic, copy) NSString *str; 1.引入运行时头文件. #import <objc/runtime.h> 2.在匿名分类或者头文件中添加属性.区别是