今天只是想看看能不能在分类中声明属性,发现果然可以,不过最好还是不要使用。
首先在一个分类里声明一个属性,执行。
没有问题
然后其它类中引入这个分类,访问我生命的这个属性。
报错了
2015-12-25 20:37:27.041 TextImage[11658:516514] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ChatBar setStr:]: unrecognized selector sent to instance 0x7fa240e57760'
没有set方法,我们在.m文件中也可以看到警告
原因是没有合成存取方法。
下面我们实现以下合成存取方法。
发现根本就没有_str,当然不能用self.str。不然就无限循环了。
set方法同理。
下面看实现方法
首先,读取一个固定数据是没问题的
像这样是可以的,就是一个只读的数据,你可以在前面把他声明为readonly。
-(NSString*)str{
return @"123";
}
下面有一种存取都可以的方法,就是使用关联对象。
方法如上面的方法,别忘了引入运行时的头文件.
但是上面有一个点,就是@“123”最好使用一个静态变量,因为该函数的关联键使用isEqual:来进行比较的,所以要指针相同,但是字符串本身就是静态的,不过最好还是使用静态变量static.
关于关联对象就好比把一些对象关联到了你的身上,用键值区分。
在这里就是把字符串关联到了self的身上。
关于关联对象类型
/* Associative References */
/**
* Policies related to associative references.
* These are options to objc_setAssociatedObject()
*/
typedef OBJC_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. */
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. */
};
分别对应与:assign nonatomic,retain nonatomic,copy retain copy
就好比定义属性类型。
以上,就是两种方法。