让Category支持添加属性与成员变量

转载 2015年11月20日 20:55:29

Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。     
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。 AssociatedObject : 关联对象

//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;

//synthesize会自动生成属性的setter,getter方法

//dynamic修饰时,settergetter方法会在程序运行时或者用其他方式动态绑定,以便让编译器通过编译,其主要作用就是用在NSManagerObject对象的属性声明.coredata框架会在程序运行时为此类属性生成gettersetter方法

- (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支持添加属性与成员变量

Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。     一种常见的办法是通过ru...

iOS Runtime详解之给Category添加成员变量(怎么设置关联对象)

好吧,没办法,在项目中我想用category,至于为什么用category而不用继承,这个我在这就不多说了,我的category博客中特意讲过,在这里就不赘述,我用了category,但是想要给我这个...

ios类别(category)不能添加成员变量但是可以添加属性的问题

类别不需要介绍了把,网上一大堆(利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没...
  • FScyj1
  • FScyj1
  • 2015-08-21 09:39
  • 2605

Objective-C如何在category里加入成员变量

OC的category是一个非常好用的特性,它允许你在不改变源码的情况下kuo zhan

Objective-C Runtime 运行时之二:成员变量与属性

在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现。 本章的主要内容将聚集在Runt...

Objective-C Runtime 运行时之二:成员变量与属性

前言在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现。本章的主要内容将聚集在Runtim...

iOS协议里面可以定义成员变量和属性吗?(刚刚)

在CSDN上看到有人提的问题,觉得很有价值,先看代码: @protocol CAMediaTiming /* The begin time of the object, in relation t...

Runtime 运行时:成员变量与属性

运行时:成员变量与属性本章的主要内容将聚集在Runtime对成员变量与属性的处理。在讨论之前,我们先介绍一个重要的概念:类型编码。成员变量、属性

Objective-C Runtime 运行时之二:成员变量与属性

在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现。 本章的主要内容将聚集在Runt...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)