让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命令)或者运行时获得对象的各种信息。






Objective-C Runtime 解析(四)—— 在Category中添加属性

在OC中,我们可以通过Category 对已有的类进行扩展,这得益于OC的Runtime机制,让类可以‘动态’的添加方法以及实现。 但是,在Category中我们无法向已有的类中添加属性,本文就介绍...
  • u013378438
  • u013378438
  • 2016年09月05日 21:52
  • 1279

由category为什么不能添加属性所想到的

在category里添加属性的情况?在类中使用@property,系统会自动生成带“_”的成员变量和该变量的setter和getter方法。也就是说,属性相当于一个成员变量加getter和setter...
  • lwq718691587
  • lwq718691587
  • 2017年03月09日 17:52
  • 282

iOS Category中添加属性和成员变量的区别

类别的简介 在开发中有时会用到Category,类别有三个作用:(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(因为框架类没有源码,不能修改)。 (2...
  • intheair100
  • intheair100
  • 2017年05月24日 23:27
  • 593

为什么category可以添加方法不能添加变量

OC是不能直接修改对象的结构体的成员变量属性,一般做法是先取出对象的结构体变量,修改该取出来的结构体变量里面的成员,再把结构体对象赋值给原来的结构体变量,在UI中为了简化代码一般对UIView做一个c...
  • hou3035
  • hou3035
  • 2016年01月14日 14:06
  • 950

使用运行时机制向Category中添加属性

简明扼要  前言 了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也...
  • cloudywend0207
  • cloudywend0207
  • 2016年07月22日 11:50
  • 1124

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

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

iOS开发之category动态添加属性的方法------关联

本文转载自:http://www.cnblogs.com/wengzilin/p/4331685.html?utm_source=tuicool  编程小翁@博客园,邮件zilin_weng@163....
  • u012273301
  • u012273301
  • 2016年05月13日 20:51
  • 987

给分类(Category)添加属性

给分类(Category)添加属性 字数626 阅读513 评论1 喜欢17 遇到一个问题,写了一个分类,但原先类的属性不够用。添加一个属性,调用的时候崩溃了,说是找不到getter、...
  • intheair100
  • intheair100
  • 2015年07月07日 17:37
  • 1581

iOS下Category添加属性字段

http://www.jianshu.com/p/00f84e05be49 首先说明一下,直接在Category中是不能添加属性的,就算在.m文件中实现了相应的getter和setter方法...
  • jeffasd
  • jeffasd
  • 2016年04月15日 18:56
  • 349

iOS runtime 机制 通过别扩展category给一个类添加属性

http://www.cnblogs.com/tangbinblog/p/3944316.html category使用 objc_setAssociatedObject/objc_getAssoc...
  • jeffasd
  • jeffasd
  • 2016年04月13日 22:54
  • 840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让Category支持添加属性与成员变量
举报原因:
原因补充:

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