[iOS]iOS在分类中声明属性的方法(不提倡使用)以及关联对象介绍

今天只是想看看能不能在分类中声明属性,发现果然可以,不过最好还是不要使用。

首先在一个分类里声明一个属性,执行。


没有问题


然后其它类中引入这个分类,访问我生命的这个属性。

报错了

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

就好比定义属性类型。





以上,就是两种方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值