1. 第一种:runtime.h里的方法
  1. BOOL class_addProperty(Class cls,
  2. const char *name,
  3. const objc_property_attribute_t *attributes,
  4. unsigned int attributeCount)
  1. #include <objc/runtime.h>
  2. #import <Foundation/Foundation.h>
  3. @interface SomeClass : NSObject {
  4. NSString *_privateName;
  5. }
  6. @end
  7. @implementation SomeClass
  8. - (id)init {
  9. self = [super init];
  10. if (self) _privateName = @"Steve";
  11. return self;
  12. }
  13. @end
  14. NSString *nameGetter(id self, SEL _cmd) {
  15. Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");
  16. return object_getIvar(self, ivar);
  17. }
  18. void nameSetter(id self, SEL _cmd, NSString *newName) {
  19. Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");
  20. id oldName = object_getIvar(self, ivar);
  21. if (oldName != newName) object_setIvar(self, ivar, [newName copy]);
  22. }
  23. int main(void) {
  24. @autoreleasepool {
  25. objc_property_attribute_t type = { "T", "@\"NSString\"" };
  26. objc_property_attribute_t ownership = { "C", "" }; // C = copy
  27. objc_property_attribute_t backingivar = { "V", "_privateName" };
  28. objc_property_attribute_t attrs[] = { type, ownership, backingivar };
  29. class_addProperty([SomeClass class], "name", attrs, 3);
  30. class_addMethod([SomeClass class], @selector(name), (IMP)nameGetter, "@@:");
  31. class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "v@:@");
  32. id o = [SomeClass new];
  33. NSLog(@"%@", [o name]);
  34. [o setName:@"Jobs"];
  35. NSLog(@"%@", [o name]);
  36. }
  37. }
  1. 输出:
  1. Steve
  2. Jobs
  1. 第二种:
  1. - (id)valueForUndefinedKey:(NSString *)key
  1. 第三种:
  1. static char const * const ObjectTagKey;
  2. @implementation NSObject (ExampleCategoryWithProperty)
  3. @dynamic objectTag;
  4. - (id)objectTag {
  5. return objc_getAssociatedObject(self, ObjectTagKey);
  6. }
  7. - (void)setObjectTag:(id)newObjectTag {
  8. objc_setAssociatedObject(self, ObjectTagKey, newObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  9. }

iOS 运行时添加属性和方法的更多相关文章

  1. 第2月第6天 iOS 运行时添加属性和方法

    http://blog.csdn.net/meegomeego/article/details/18356169 第一种:runtime.h里的方法 BOOL class_addProperty(Cl ...

  2. javascript面向对象(给对象添加属性和方法的方式)

    1.在定义对象时,直接把属性和方法添加 <script type="text/JavaScript"> //给对象直接在定义时添加属性和方法         var g ...

  3. iOS运行时 -- Runtime(摘抄自网络)

    运行时(iOS) 一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得某个 ...

  4. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...

  5. iOS 运行时详解

    注:本篇文章转自:http://www.jianshu.com/p/adf0d566c887 一.运行时简介 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行 ...

  6. prototype为对象添加属性和方法

    可以通过prototype来为已经定义好的的"类"添加属性和方法.这里来了解一下prototype的基础知识.prototype是"构造函数"的属性,不是实例的 ...

  7. 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】

    一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...

  8. day_5.26python动态添加属性和方法

    python动态添加属性和方法 既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx '''2018-5-26 13:40:09pyth ...

  9. 【JavaScript】浅析JavaScript对象如何添加属性和方法

    向JavaScript类中添加属性和方法,最直观的做法就是在类中定义属性和方法.JavaScript是一门弱语言,除了直接定义还可以用prototype来添加. 下面介绍从外部向JavaScript添 ...

随机推荐

  1. 3CSS基本语法

    ------------------------- --------------------------------------- -------------------------------- & ...

  2. SQL基本操作——创建索引

    CREATE INDEX 语句用于在表中创建索引.在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据. 索引:您可以在表中创建索引,以便更加快速高效地查询数据.用户无法看到索引,它们只能被 ...

  3. 如何利用Flashback Query 恢复误删除的数据

    网上有很多关于数据回复的文章,这里整理一篇供大家参考,希望能帮助的大家! 推荐一家即时通讯云服务商:www.yun2win.com,功能包含im即时通讯.实时音视频.电子白板.屏幕共享的多种融合通讯云 ...

  4. url取值乱码问题,url加中文导致页面不能加载问题 js unicode转码,以及解码

    很多时候写H5或其他适配时,打不开url.很多原因是因为浏览器不支持中文url,从url拿 出来的中文值也会乱码,这时候就必须把中文转化成Unicode值,去进行页面传值 中文转Unicode fun ...

  5. Linux常用命令(简单的常用)

      1. 文件和目录 cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd ...

  6. Lua中返回值的丢失问题

    Lua中返回值的丢失问题 -- 如果函数调用所得的多个返回值是另外一个函数的最后一个参数,或者是多指派表达式中的最后一个参数时,所有返回值将被传入或使用. -- 否则只有第一个返回值被使用或指定. T ...

  7. 发现是在IE6-IE9下,下列元素table,thead,tfoot,tbody,tr,col,colgroup,html,title,style,frameset的innerHTML属性是只读的

     table ID="zhutiTable" html2="<tr></tr>": 的数据 setTableInnerHTML(docu ...

  8. idea热更新配置

    idea部署热启动如下,经过本人实验 在这里只能选择exploded因为它支持热部署 在这里选择如下 到这里已经完成热部署了,如果有问题欢迎反馈给我,我会及时回复

  9. java折半插入排序

    代码如下: public class BinaryInsertSort { public static void binaryInsertSort(DataWrap [] data) { System ...

  10. Python 元组和列表

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...