突然想到了这么一个问题,就是创建的 一个类的 分类时 想要添加属性,之后被访问,该怎么办?正常情况下,在类目中是无法添加属性,但是...真的不可以吗?答案是否定的.
先上图之后 再做解释,请看下图:
.h文件中,先声明属性
.h文件.m文件中,去实现方法
.m文件这样做完之后,在使用MMWPTHTTPService的实例变量时就可以给name这个属性进行赋值及访问啦。(注意点!!!!!:分类中添加的属性 只能在本类的实例变量中能够使用,在其子类下是无法进行访问的,可以理解成为本类的私有属性)
/// - ======== 正文开始 进行解释 ======= -
1. .h文件的声明属性,在这儿就不做多解释了,声明一个属性即可。下面重点放到.m文件中说明。
2.想要在 类目中添加属性 被使用时,需要用到一个核心技术 runtime机制去实现 属性存取方法,即: getter和setter方法。
(1).在.m中首先导入 runtime时的头文件: #import <objc/runtime.h>
(2).在.m中添加setter方法:- (void)setName:(NSString*)name、和 getter方法:- (NSString*)name,见上图。在setter方法中的objc_setAssociatedObject是有四个参数的,分别是原对象(本类self)、关联时用到的标记(nameKey:即哪个属性的key,最好使用属性名+key。因为属性可以添加多个,易于区分)、关联的对象和一个关联策略。
其中nameKey的写法有以下几种,仅供参考:(利用静态变量地址唯一不变的特性)
1.static void *nameKey = &nameKey;
2.static NSString * nameKey = @"nameKey";
3.static char nameKey;
关联策略是个枚举值,将其进行了百度翻译,如下:
/**
* Policies related to associative references.
* These are options to objc_setAssociatedObject()
*/
typedefOBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN =0, /**< Specifies a weak reference to the associated object. *///关联对象的属性是弱引用
OBJC_ASSOCIATION_RETAIN_NONATOMIC =1, /**< Specifies a strong reference to the associated object. The association is not made atomically. *///关联对象的属性是强引用并且关联对象不使用原子性
OBJC_ASSOCIATION_COPY_NONATOMIC =3, /**< Specifies that the associated object is copied The association is not made atomically. *///关联对象的属性是copy并且关联对象不使用原子性
OBJC_ASSOCIATION_RETAIN =01401, /**< Specifies a strong reference to the associated object. The association is made atomically. *///关联对象的属性是强引用并且关联对象使用原子性
OBJC_ASSOCIATION_COPY =01403 /**< Specifies that the associated object is copied The association is made atomically. */关联对象的属性是copy并且关联对象使用原子性
};
===== --- ===== 打功完成 ==== ----
网友评论