码迷,mamicode.com
首页 > 其他好文 > 详细

Catogory如何添加属性

时间:2017-09-13 11:57:57      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:type   定义   内部使用   交互   log   soc   不能   无法   self   

一,Category结构体

typedef struct category_t {
    const char *name;  //类的名字
    classref_t cls;  //
    struct method_list_t *instanceMethods;  //category中所有给类添加的实例方法的列表
    struct method_list_t *classMethods;  //category中所有添加的类方法的列表
    struct protocol_list_t *protocols;  //category实现的所有协议的列表
    struct property_list_t *instanceProperties;  //category中添加的所有属性
} category_t;

从Category的定义也可以看出Category的可为(可以添加实例方法,类方法,甚至可以实现协议,添加属性)和不可为(无法添加实例变量)。

为什么很多人都说Category不能添加属性呢?

实际上,Category实际上允许添加属性的,同样可以使用@property,但是不会生成_变量(带下划线的成员变量),也不会生成添加属性的getter和setter方法的实现,所以,尽管添加了属性,也无法使用点语法调用getter和setter方法

 

二,首先需要分清楚两个概念:属性和变量

成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。

 

三,使用runtime去实现Category为已有的类添加新的属性并生成getter和setter方法

实例:1

#import <UIKit/UIKit.h>

@interface UIViewController (Router)

/** 参数字典 */
@property (nonatomic, strong) NSDictionary *paramDic;

@end

 

#import "UIViewController+Router.h"
#import <objc/runtime.h>

static const void *ParamDicKey = &ParamDicKey;

@implementation UIViewController (Router)

- (void)setParamDic:(NSDictionary *)paramDic
{
    objc_setAssociatedObject(self, ParamDicKey, paramDic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSDictionary *)paramDic
{
    return objc_getAssociatedObject(self, ParamDicKey);
}

@end

 

Catogory如何添加属性

标签:type   定义   内部使用   交互   log   soc   不能   无法   self   

原文地址:http://www.cnblogs.com/developer-qin/p/7513944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!