objc runtime 动态增加属性-备用(?)

objective-c中,有类别可以在不修改源码的基础上增加方法;近排在看别人的开源代码时,发现还可以动态增加属性。而且是在运行时,太牛B了。

使用运行时库,必须要先引入 objc/runtime.h

可以使用的函数如下:

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

这个函数

OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) 
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

兄弟们,看一个类别和动态添加属性的例子:

UILabel+Associate.h

#import <UIKit/UIKit.h>

@interface UILabel (Associate)

- (void) setFlashColor:(UIColor *) flashColor;

- (UIColor *) getFlashColor;

@end

UILabel+Associate.m

#import "UILabel+Associate.h"
#import <objc/runtime.h>

@implementation UILabel (Associate)

static char flashColorKey;

- (void) setFlashColor:(UIColor *) flashColor{
    objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIColor *) getFlashColor{
   return objc_getAssociatedObject(self, &flashColorKey);
}

@end

调用代码:

UILabel *lab = [[UILabel alloc] init];
    [lab setFlashColor:[UIColor redColor]];
    NSLog(@"%@", [lab getFlashColor]);
时间: 2024-12-19 20:03:39

objc runtime 动态增加属性-备用(?)的相关文章

Runtime(动态添加属性)

下面通过一个实例展示一下Runtime(动态添加属性)的用法

runtime动态添加属性

<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px; background-color: rgb(254, 254, 242);">使用运行时库,必须要先引入 objc/runtime.h</span> <span style="font-family: Verdana, Arial, Helve

[js]给Json动态增加属性

目标:给JSON数据任意增加新属性 环境:页面 技术:JS 实现: var JSON = {'name':'momojin','ega',22} JSON["isParent"]=true; alert(JSON.isParent); 任意增加,随意操作 childNodes[i]["isParent"]=true; 下标类的直接写在下标后面.

php 给对象动态增加属性

<?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public function add() { $this->b = 'world'; }- public static function p() { echo 'world',PHP_EOL; }- } $a = new A; $a->add(); $a->c = 'test'; $a->p();

iOS 动态添加属性方法

写在前面: 动态增加属性也不是很肆意的增加,是需要代码进行写的.如果一个类没有那个属性,那么在编译阶段就会报错而导致无法进行.之所以还叫做动态添加大致上是因为可以不重写某个类,而进行相应的属性的添加吧!不扯那么多了.切入正题: 首先需要创建类别,用来写入相应的set/get方法. #import <UIKit/UIKit.h> @interface UILabel (Associate) - (void) setFlashColor:(UIColor *) flashColor; - (UIC

Runtime 实现 动态添加属性

利用动态加载为对象添加一个 block 点击属性; .h 文件 1 #import <UIKit/UIKit.h> 2 3 @interface UIView (Tap) 4 /** 5 * 动态添加手势 6 */ 7 - (void)setTapActionWithBlock:(void (^)(void))block ; 8 @end .m 文件 1 #import "UIView+Tap.h" 2 #import <objc/runtime.h> 3 /*

js+jquery动态设置/增加/删除/获取元素属性的两种方法集锦对比(动态onclick属性设置+动态title设置)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>

objc runtime之属性扩展(objc_getAssociatedObject,objc_setAssociatedObject,objc_removeAssociatedObjects)

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 法:associative,可以通过它来扩展属性:在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用 它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssociatedObject以及 objc_setAssociatedObject,我们来看下这两个方法: 1.创建关联:参数设置

iOS Objc Runtime 教程+实例Demo

例子Demo 欢迎给我star!我会继续分享的. 概述 Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类.对象和它们的方法.Runtime是C和汇编编写的,这里http://www.opensource.apple.com/source/objc4/可以下到苹果维护的开源代码,GNU也有一个开源的runtime版本,他们都努力的保持一致. 应用场景 将某些OC代码转为运行时代码,探究底层,比如block的实现原理 拦截系统自带的方法调用(Swizzle 黑魔法),