在既有类中使用关联对象存放自定义数据

Jetson Orin Nano GPIO 实战,用 devmem 玩转 Pinmux 引脚复用配置 devmem 是一个直接读写寄存器的工具,通过 mmap 将 /dev/mem 中的物理地址区域映射到用户空间进程地址空间,从而实现直接读写,正常情况下在 /dev 下可以看到 mem。可以看到对应 bit5 bit6 分别为 1,对应配置为 E_IO_HV 为 ENABLE 以及 E_INPUT 为 ENABLE。需要 TRM 手册查看相关寄存器,以及安装 busybox,busybox 内置了 devmem。根据 TRM 手册,找到 I2C_SDA 的 pinmux 地址偏移是 0x18。 阅读详情

**
**
有时需要在对象中存放相关信息。这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,有时候类的实例可能是由某种机制所创建的,而开发者无法令这种机制创建出自己所写的子类实例。Objective-C中有一项强大的特性可以解决此问题,这就是“关联对象”(Associated Object)。
下列方法可以管理关联对象:

void objc_setAssociatedObject(id object, void*key, id value, objc_AssociationPolicy policy)

此方法以给定的键和策略为某对象设置关联对象值。

id objc_getAssociatedObject(id object, void*key)

此方法根据给定的键从某对象中获取相应的关联对象值。

void objc_removeAssociatedObjects(id object)

此方法移除指定对象的全部关联对象。
我们使用UIAlertView类,通过分类将简写,通过block关联到alertView.
如果想在同一个类里处理多个警告信息视图,那么代码就会变得更为复杂,我们必须在delegate方法中检查传入的alertView参数,并据此选用相应的逻辑。要是能在创建警告视图的时候直接把处理每个按钮的逻辑都写好,那就简单多了。这可以通过关联对象来做。创建完警告视图之后,设定一个与之关联的“块”(block),等到执行delegate方法时再将其读出来

#import <UIKit/UIKit.h>

typedef void (^SuccessBlock)(NSInteger index);

@interface UIAlertView (Block)<UIAlertViewDelegate>

- (void)showWithBlock:(SuccessBlock) successBlock;

@end
#import "UIAlertView+Block.h"
#import <objc/runtime.h>

static const char alertKey;

@implementation UIAlertView (Block)

- (void)showWithBlock:(SuccessBlock)successBlock{

    if (successBlock) {
        objc_setAssociatedObject(self, &alertKey, successBlock, OBJC_ASSOCIATION_COPY);
        self.delegate = self;
    }
    [self show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    SuccessBlock block = objc_getAssociatedObject(self, &alertKey);

    block(buttonIndex);
}

@end

还可以使用UIButton来将其与block关联

#import <UIKit/UIKit.h>

typedef void(^ButtonBlock)(UIButton *button);

@interface UIButton (btnBlock)

- (void)hanClickButtonWithBlock:(ButtonBlock)block;

@end
#import "UIButton+btnBlock.h"
#import <objc/runtime.h>

static const char buttonKey;

@implementation UIButton (btnBlock)

- (void)hanClickButtonWithBlock:(ButtonBlock)block{

    if (block) {

        objc_setAssociatedObject(self, &buttonKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);

        [self addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside];

    }

}

- (void)clickButton{

    ButtonBlock block = objc_getAssociatedObject(self, &buttonKey);

    block(self);

}

@end

在viewController中使用

#import "ViewController.h"
#import "UIAlertView+Block.h"
#import "UIButton+btnBlock.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 30, 30)];
    [button setTitle:@"buttonBlock" forState:UIControlStateNormal];
    button.backgroundColor = [UIColor greenColor];
    [self.view addSubview:button];

    [button hanClickButtonWithBlock:^(UIButton *button) {

        NSLog(@"%@",button.titleLabel.text);

        [self click];

    }];


}

- (void)click{
    UIAlertView *alerts = [[UIAlertView alloc] initWithTitle:@"www" message:@"111" delegate:self cancelButtonTitle:@"q" otherButtonTitles:@"yyy", nil];
    [alerts showWithBlock:^(NSInteger index) {

        if (index == 0) {
            NSLog(@"1");

        }

        if (index == 1) {
            NSLog(@"2");
        }

    }];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

以这种方式改写之后,创建警告视图与处理操作结果的代码都放在一起了,这样比原来更易读懂,因为我们无须在两部分代码之间来回游走,即可明白警告视图的用处。但是,采用该方案时需注意:块可能要捕获(capture)某些变量,这也许会造成“循环引用”(retain cycle)。

正如大家所见,这种做法很有用,但是只应该在其他办法行不通时才去考虑用它。若是滥用,则很快就会令代码失控,使其难于调试。“循环引用”产生的原因很难查明,因为关联对象之间的关系并没有正式的定义(formal definition),其内存管理语义是在关联的时候才定义的,而不是在接口中预先定好的。使用这种写法时要小心,不能仅仅因为某处可以用该写法就一定要用它。想创建这种UIButton还有个办法,那就是从中继承子类,把块保存为子类中的属性。

RT-DETR改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性 Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。 阅读详情

相关推荐

U8 API接口开发踩过的坑

U8 API接口开发踩过的坑

haiyang5233233的专栏 1655

数据关联

关联关系是一种结构化关系,指两个对象间存在的某种联系 在java层面上,数据关联是一个类中包含另外一个类的对象 在DB层面上,数据关联是一个表中包含另外一个表的数据,本质是外键 在Hibernate框架中,关系体现在持久化对象之间的关联 关联分类 单向关联、双向关联 一对一(1:1)、一对多/多对一(1:n)、多对多(n:m)Hibernate针对

qq_31887677的博客 3617

Xilinx ERNIC RoCEv2 FPGA实现与QP队列深度解析

本文深入解析Xilinx ERNIC RoCEv2在FPGA上的实现,重点剖析QP队列对的管理机制与深度优化策略。通过Verilog代码示例和工程实战,详细介绍了如何实现高吞吐量、低延迟的RDMA硬件卸载方案,为金融交易和数据中心应用提供性能优化指导。

solidity8miner的博客 875

自定义对象的属性增加

只要在自定义对象的声明实例变量处添加 变量 就能 自动地 在属性栏出现(下图): 并且,什么类型变量自动对应什么编辑格式(int对应单行数字编辑框,string对应单行文本编辑框,boolean对应单选框)

吴半止的专栏 386

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面

本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。

efc123456的博客 1063

win2016 php mysql_Windows Server 2016 IIS10.0+PHP(FastCGI)+MySQL环境搭建教程 | 系统运维...

准备篇一、环境说明:操作系统:Windows Server 2016PHP版本:php 7.1.0MySQL版本:MySQL 5.7.17.0二、相关软件下载:1、PHP下载地址:2、MySQL下载地址:3、Microsoft Visual C++ 2010 可再发行组件包(安装MySQL需要此插件)4、Visual C++ Redistributable for Visual Studio 20...

weixin_34794420的博客 1377

第10条:在既有类中使用关联对象存放自定义数据

在对象中存放相关信息的方式: 1、从对象所属的类中继承一个子类,然后改用这个子类对象。   然而有时类的实例可能是由某种机制所创建的,无法使用这种机制创建自己所写的子类实例。所以采用第2种方式-----“关联对象” 2、关联对象   可以给某对象关联多个对象,这个对象用“键”来区分,存储对象值的时,可以指明“存储策略”。存储策略由名为objc_AssociationPoli...

133

代码解读:使用Stable Diffusion完成相似图像生成任务

作为内容生产重要的一部分,生成相似图像是一项有意义的工作,例如很多内容创作分享平台单纯依赖用户贡献的图片已经不够了,最省力的方法就是利用已有的图片生成相似的图片作为补充。这篇博客详细解读基于Stable Diffusion生成相似图片的原理和代码。

沉迷单车的追风少年 1392

第10条:在既有类中使用关联对象存放自定义数据

  本条要点:(作者总结) 可以通过“关联对象”机制来把两个对象连起来。 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系”。 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难以查找的 bug。   有时需要在对象中存放相关信息。这时我们通常从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,...

weixin_30474613的博客 78

AgentScope实战训练营:从零搭建一个完整的A2A Agent应用

2024年4月,Google在Google Cloud Next大会上正式提出了A2A(Agent-to-Agent)协议,这是一个开放协议,旨在让不同的AI Agent之间能够像微服务一样相互发现、相互调用。通俗地讲:A2A协议就是AI Agent世界的HTTP协议——有了它,一个Agent可以把自己的能力以标准化的方式暴露出去,另一个Agent可以无缝地发现并调用它。本文将基于阿里巴巴开源的(Apache 2.0协议),手把手带你从零搭建一个完整的A2A Agent应用。

program哲学 561

基于深度学习YOLOv8的花卉检测与识别系统(附完整资源+PySide6界面+训练代码)

通过本项目,我们成功实现了基于YOLOv8的花卉检测与识别系统,涵盖了数据预处理、模型训练、推理与实时检测、以及GUI界面的实现。YOLOv8在花卉检测中的高效性和准确性为实际应用提供了强有力的支持。

斌擎科技 715

Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据

可以通过“关联对象”机制来把两个对象连起来 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系” 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于查找的 bug 目的:需要在对象中存放相关信息,方法一,从对象所属的类中继承一个子类,然后改用这个子类对象。   方法二:关联对象(Associated Object),对象...

123

7 中望CAD二次开发-标注(一)(ZRX C++)

尺寸标注是CAD设计中最常用的功能之一,软件内置了很多标注功能,可以通过使用这些标注工具,对需要标注的长度、角度等一个个进行标注。但这显然效率很低,学习CAD二次开发,就是要把人从重复的劳动中解放出来,实现批量标注。本文介绍,如何通过二次开发进行标注。

cilvsuanna的博客 338

Effective Objective-C 2.0 第10条:在既有类中使用关联对象存放自定义数据

有时需要在对象中存放相关信息,OC中有一种强大的特性可以解决此类问题,就是“关联对象”。 可以给某个对象关联许多其他对象,这些对象通过“键”来区分。存储对象值时,可以指明“存储策略”,用以维护相应地“内存管理语义”。存储策略由名为 “objc_AssociationPolicy” 的枚举所定义。OBJC_ASSOCIATION_ASSIGN -> assign OBJC_ASSOCIATION_R

我的脚步 839

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

第十条:在既有类中使用关联对象存放自定义数据

转载于:https://www.cnblogs.com/xsyl/p/5817838.html

weixin_34174105的博客 95

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Effective Objective-C 2.0 编写高质量iOS与OS X代码 在既有类中使用关联对象存放自定义数据

1. 可以通过“关联对象”机制来把两个对象连起来。 2. 定义关联对象时,可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”和“非拥有关系”。 3. 只有再其他做法不可行时才应选择关联对象,因为这种做法通常会引入难以查找的bug。 有时候类的实例可能是某种机制所创建,而开发者无法令这种机制创建出自己所写的子类实例。 可以给某对象关联许多其他对象。这些

学习、记录、分享。 2398

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[Effective Objective] 对象、消息、运行期

Objective-C的做法是,把实例变量当作一种储存偏移量所用的“特殊变量”(special variable),交由“类对象”(class object)保管。偏移量会在运行期查找,如果类的定义变了,那么储存的偏移量也就变了,这样的话,无论何时访问实例变量,总能使用正确的偏移量。这就是稳固的应用程序二进制接口(Application Binary Interface, ABI)。有时需要在对象中存放相关信息。这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。

m0_63852285的博客 706

iOS开发--开发细节(使用关联对象存取自定义数据)

为了方便使用我直接定义成了宏 如果想使用 可以直接粘过去 SF 和 openUrl 是必须要加的 //stringdefine StringFormat(_format,_arg) [NSString stringWithFormat:_format,_arg]define SF(_format,_arg) StringFormat(_format,_arg)define SF2(_for

MX_xuanXiao的博客 590

Effective-OC 10.在既有类中使用关联对象存储自定义数据

有时候需要在对象中存放相关的信息 这时候我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有的情况都能这么做。有的时候 类的实例可能是由某种机制创建的,而开发者无法令这种机制创建出自己写的子类的实例,OC中有一强大的特性可以解决这个问题 就是“关联对象”         可以给某对象关联许多其他的对象 这些对象通过“键”来区分。存储对象值 可以指明“存储策略”,用以维护相对

为者常成,行者常至 1341
上一篇: 线程间通信
下一篇: 百度地图开发API
Step_Next
博客等级 码龄11年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值