iOS 给类别(Category)添加weak (property)属性,关联(Associated)

Category 在平常代码中经常使用,在使用第三方工具时,遇到工具不能直接解决当前问题的情况,我就会使用到Category,通过给特定的类加一个方法来处理这种情况。

本文仅仅介绍给(Category)加 weak 属性。
weak:修饰OBJC对象,不会持有指向修饰对象,同样指向的对象引用计数就不会增加,当指向的对象被释放释放的时候,weak修饰的对象会被置为nil。
因为堆内存是动态的,所以当某个地址的对象被释放的时候,所有指向他的指针都应该被置为空。weak就是为了满足避免循环引用,同时在对象被释放的时候可以被置为空的情况而存在的。
assign是为了修饰栈内存中的数值对象,当使用assign修饰了一个OBJC对象的时候,可能造成野指针。原因在上面刚刚提到。

进入主题:给 Category 添加 weak 属性。
首先,给 Category 属性是需要使用runtime中的关联来实现set 和 get 方法。但runtime只提供如下几种修饰实现,并没有weak。

image.png

看了别人的思路之后,加以修改。思路是这样的,虽然runtime没有开放weak解决方案,但OBJC对象是可以实现weak的,所以让需要被修饰的对象去持有一个strong的对象,然后当被修饰的对象被释放的时候,持有的对象也会被释放,那么我们就可以捕捉到释放的事件,进而使用OBJC_ASSOCIATION_ASSIGN 来实现弱引用,在释放事件里面再将其释放掉,进而实现weak功能。

具体体验weak 和 assgin的区别:

@property (nonatomic,weak) id      weakPoint;
@property (nonatomic,assign) id    assignPoint;
@property (nonatomic,strong) id    strongPoint;

self.strongPoint = [NSDate date];
self.weakPoint = self.strongPoint;
self.assignPoint = self.strongPoint;
self.strongPoint = nil;
NSLog(@"%p", self.weakPoint); // print 0x0 指针置为空。
NSLog(@"%p", self.assignPoint); // crash 因为self.assignPoint指针指向的对象已经被释放。

测试weak是否正确:

self.strongPoint = [NSDate date];
self.objc_weak_id = self.strongPoint;
self.weakPoint = self.strongPoint;
NSLog(@"%p", self.weakPoint); // print 指针。
NSLog(@"%p", self.objc_weak_id); // print 相同的指针。
self.strongPoint = nil;

NSLog(@"%p", self.weakPoint); // print 0x0 指针置为空。
NSLog(@"%p", self.objc_weak_id); // print 0x0 指针置为空。

在Category中添加 property 相对添加方法少一些,而添加weak property是少之又少,但实现 通过这次实践,你可以明白什么是weak,什么是assign,而不是仅仅知道delegate中用weak,NSInteger用assign。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天很想讲讲公司小A,17岁的程序猿一枚,绝对的未成年小屁孩。我们公司一致爱称为万能小A,小A17岁之前没有乖乖地...
    羊一羊阅读 248评论 4 2
  • 进群看姐妹们的感赏日志已经成了我每日的必修课,每每动摇的心进了群里就会不知不觉的安定下来,心情也会平静下来。...
    馨月儿1阅读 212评论 3 8
  • 亲爱的联合会家人,您已成功报名参加1月27日中午11点至2点在东城榴花公园入口处敦素会馆(状元家宴店)举行的"东莞...
    喻静静阅读 210评论 0 0
  • 明明有很多事情要做,却不知道该怎么着手。明明是在做自己喜欢做的事,却总觉得不踏实。开始怀疑现在的意义。开始计划着暂...
    向应昌阅读 571评论 0 7
  • 这世间喧喧闹闹,热闹过的消遣过的终究要归于沉寂。我不喜欢大部分人消费Kimi。很多人的悼念之前似乎都要加一句,其实...
    妤和阅读 159评论 0 0