让Category支持添加属性与成员变量【转载】
Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
- //NSObject+IndieBandName.h
- @interface NSObject (IndieBandName)
- @property (nonatomic, strong) NSString *indieBandName;
- @end
上面是头文件声明,下面的实现的.m文件:

- // NSObject+IndieBandName.m
- #import "NSObject+Extension.h"
- #import <objc/runtime.h>
- static const void *IndieBandNameKey = &IndieBandNameKey;
- @implementation NSObject (IndieBandName)
- @dynamic indieBandName;
- - (NSString *)indieBandName {
- return objc_getAssociatedObject(self, IndieBandNameKey);
- }
- - (void)setIndieBandName:(NSString *)indieBandName{
- objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- @end

DLIntrospection
这个和Category无关,但是也是runtime.h的一种应用。DLIntrospection,是 一个NSObject Category。它为NSObject提供了一系列扩展函数:

- @interface NSObject (DLIntrospection)
- + (NSArray *)classes;
- + (NSArray *)properties;
- + (NSArray *)instanceVariables;
- + (NSArray *)classMethods;
- + (NSArray *)instanceMethods;
- + (NSArray *)protocols;
- + (NSDictionary *)descriptionForProtocol:(Protocol *)proto;
- + (NSString *)parentClassHierarchy;
- @end

通过这些函数,你可以在调试时(通过po命令)或者运行时获得对象的各种信息。
让Category支持添加属性与成员变量【转载】的更多相关文章
- 关于iOS Category实现添加属性及成员变量
iOS分类: 很多说法是只能添加方法,而不能添加成员变量或属性. 有些人可能知道,这种说法是不严谨的,并不是绝对不能添加变量. 解释如下: 我们知道在一个类中用@property声明属性,编译器会自动 ...
- IOS学习5——属性与成员变量
[转]iOS中属性与成员变量的区别 ios中属性修饰符的作用 1. 属性用property声明 2. 简而言之,对于目前的ios开发,属性和成员变量的区别,完全可以不管. 3. 这个是历史原因造成的. ...
- Objective-C的属性和成员变量用法及关系浅析
在使用Objective-C语言进行了一段时间的iOS开发之后,发现自己的语言基础相对薄弱,于是开始弥补自己的短处.我发现在用过一种语言之后,再回过头来看它的很多原理会发现有更加深刻的理解.下面就对一 ...
- OC中在.h和.m中声明的属性和成员变量有何区别?
相比Swift而言,OC规矩太多. 差不多,.h中声明的属性和成员变量均可以在子类中访问到.而.m则不可.而属性其实也就是成员变量的一种简写,其内部自动包含了getter和setter方法. 如图:V ...
- Object-c中的属性和成员变量的关系详解
很多人在初学移动开发的时候会对object-c中的合成存取方法感到疑惑,此处尝试为看到本文有缘人答疑解惑,鄙人才疏学浅,难免有疏漏谬误之处,热烈欢迎诸位看官拍砖指点. 1.合成存取方法: OC为增加开 ...
- JavaBean属性和成员变量的区别和联系
JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性.名称中的“Bean”是用于 ...
- iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行
一.Runtime的理解 OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用! 二.类别(category)添加属性_使用前记得导入头 ...
- iOS中属性与成员变量的区别
一.类Class中的属性property 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfa ...
- 【转】iOS中属性与成员变量的区别
[转载自并整理 http://blog.csdn.net/itianyi/article/details/8618128] 一.类Class中的属性property 在ios第一版中,我们为输出口同时 ...
随机推荐
- ACdream1032(树形DP)
ACdream1032 题意 给出一棵树,每个节点有权值,问由 \(1\) ~ \(n\) 个节点组成的树块的权值和的最小值. 分析 首先发现 \(n\) 很小,那么我们可以开一个二维数组 \(dp[ ...
- Mysql insert without auto-increase when duplicate
INSERT INTO video_tag_all(tagname,ctime) FROM video_tag_all WHERE (SELECT last_insert_id(id) FROM vi ...
- Visio中如何让重叠图形都显示
如图,两个矩形重叠部分的边框都显示了,是拆分操作,不是组合.
- Android-Binder 简析
前言 对于Android来说,Binder的重要性怎么说都不为过.不管是我们的四大组件Activity.Service.BroadcastReceiver.ContentProvider,还是经常在应 ...
- [置顶]
kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim
概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...
- git只拉取github部分代码的方法
需求:github某个项目所有代码太大,有600+M,甚至更大:只需要拉取部分代码,一是可以降低网络消耗,二是可以降低磁盘占用 分析了下空间占用情况:发现每个项目下的.git/objects/pack ...
- Java源码阅读HashMap
1类签名与注释 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cl ...
- 最长公共字串算法, 文本比较算法, longest common subsequence(LCS) algorithm
''' merge two configure files, basic file is aFile insert the added content of bFile compare to aFil ...
- 【转】javascript 的类,原型,继承的理解
原文: https://www.cnblogs.com/codernie/p/9098184.html ------------------------------------------------ ...
- How does a single thread handle asynchronous code in JavaScript?
原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...