博客
关于我
association weak 属性
阅读量:585 次
发布时间:2019-03-11

本文共 1104 字,大约阅读时间需要 3 分钟。

类似于将属性设置成weak引用,我们可以通过自定义容器类和关联策略来实现这种弱引用行为。以下是详细的步骤说明和优化后的内容:

首先,我们创建一个自定义容器类WeakAssociationObjectContainer,它需要拥有一个弱引用对象。声明如下:

@interface WeakAssociationObjectContainer : NSObject@property (nonatomic, readonly, weak) id weakObject;- (instancetype)initWeakObject:(id)object;@end

接下来,实现这个容器类:

@implementation WeakAssociationObjectContainer- (instancetype)initWeakObject:(id)object {    self = [super init];    if (self) {        _weakObject = object;    }    return self;}@end

然后,再在拥有这个属性的类中添加以下方法:

@implementation NSObject (WeakAssociate)- (void)setWeakProperty:(id)weakProperty {    WeakAssociationObjectContainer *container = [[WeakAssociationObjectContainer alloc] initWeakObject:weakProperty];    objc_setAssociatedObject(self, @selector(weakProperty), container, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (id)weakProperty {    WeakAssociationObjectContainer *container = objc_getAssociatedObject(self, _cmd);    return container.weakObject;}@end

这种方法通过关联策略OBJC_ASSOCIATION_RETAIN_NONATOMIC来实现,其可行性最终取决于真实对象的归 Eagles情况。这种手动管理方式提供了类似weak属性的行为,但需要特别注意对象生命周期和内存管理问题。通过这种方式,可以在不支持weak属性的iostream中实现对属性对象的弱引用。

转载地址:http://wlttz.baihongyu.com/

你可能感兴趣的文章
Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
查看>>
Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
查看>>
Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
查看>>
Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
查看>>
Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
查看>>
Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
查看>>
Openlayers高级交互(8/20):选取feature,平移feature
查看>>
Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
查看>>
Openlayers:DMS-DD坐标形式互相转换
查看>>
openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
查看>>
OpenLDAP(2.4.3x)服务器搭建及配置说明
查看>>
OpenLDAP编译安装及配置
查看>>
Openmax IL (二)Android多媒体编解码Component
查看>>
OpenMCU(一):STM32F407 FreeRTOS移植
查看>>
OpenMCU(三):STM32F103 FreeRTOS移植
查看>>
OpenMCU(三):STM32F103 FreeRTOS移植
查看>>
OpenMCU(二):GD32E23xx FreeRTOS移植
查看>>
OpenMCU(五):STM32F103时钟树初始化分析
查看>>
OpenMCU(四):STM32F103启动汇编代码分析
查看>>
OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
查看>>