runtime - 属性扩展(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?... 莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性... 阅读详情

category与associative作为objective-c的扩展机制的两个特性,

category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;

在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssociatedObject以及 objc_setAssociatedObject,


我们来看下这两个方法:

1.创建关联:参数设置(源对象,关键字,关联的对象和一个关联策略)



2.获取关联对象:参数设置(源对象,关键字)


另外,还有一个方法:可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。



注:断开关联可使用objc_setAssociatedObject(源对象,关键字,关联的对象和一个关联策略) ,关联对象传入nil即可;

  关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。

     关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。


关联

  1. 关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
  2. 关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。

在类的定义之外为类增加额外的存储空间

  • 使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
  • 关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。

创建关联

  • 创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
  • 关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
  • 关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。

下面的代码展示了如何把一个字符串关联到一个数组上

static char overviewKey;  
NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];  
//为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁  
NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];  
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);   
[overview release];  
//(1) overview仍然是可用的  
[array release];  
//(2)overview 不可用 

在(1)处,字符串overview仍然是可用的,这是因为OBJC_ASSOCIATION_RETAIN策略指明了数组要保有相关的对象。当数组 array被销毁的时候,也就是在(2)处overview也就会被释放,因此而被销毁。如果此时还想使用overview,例如想通过log来输出overview的值,则会出现运行时异常。

获取相关联的对象

获取相关联的对象时使用Objective-C函数objc_getAssociatedObject。接着上面的代码,我们可以使用如下代码来获取与array相关联的字符串:

NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &oveviewKey);  

断开关联

断开关联是使用objc_setAssociatedObject函数,传入nil值即可。
我们可以使用如下的代码来断开字符串overview和arry之间的关联:

objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);  

其中,被关联的对象为nil,此时关联策略也就无关紧要了。

断开所有关联

使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

一个完整的实例程序


#import <objc/runtime.h>  


int main(int argc, const char* argv[])  
{  
    NSAutoreleasePool * pool = [[NSAutoreleasePool] alloc init];  

    static char overviewKey;  
    NSArray *array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];  
    //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁  
    NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];  
    objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);  
    [overview release];  

    NSString *associatedObject = (NSString *)objc_getAssociatedObject(arrray, &overviewKey);  
    NSLog(@"associatedObject:%@", associatedObject);  

    objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);  
    [array release];  

    [pool drain];  
    return 0;  
}  





华为OD机考真题 新系统 - 数列求值(Java/Py/C/C++/Js/Go) 华为OD机试真题 新系统【数列求值】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数列求值】多语言题解。 阅读详情

相关推荐

python电子学会三级的零碎笔记

‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。

xzal12的博客 691

OC关联objc_setAssociatedObject, 如何使用及原理

面试题 Category能否添加成员变量?如果可以,如何给Category添加成员变量? 答:不能直接添加成员变量,但是可以通过runtime的方式间接实现添加成员变量的效果。 为什么Category 不能添加成员变量? 我们从分类的结构的角度来考虑一下分类中为什么不能添加成员变量: 通过分类的底层结构我们可以看到,分类中可以存放实例方法,类方法,协议,属性,但是没有存......

gcs的博客 4821

微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)

本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。

weixin_29325007的博客 455

category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性

http://www.cnblogs.com/tangbinblog/p/3944316.html category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性 属性 其实就是get/set 方法。我们可以使用  objc_setAssociatedObject/objc_getAssocia

jeffasd的专栏 468

【Clickhouse从入门到精通】第51篇:ClickHouse权限管理体系详解

摘要 本文是ClickHouse权限管理系列文章的第51篇,重点解析ClickHouse RBAC权限体系中的GRANT/REVOKE机制。文章详细介绍了GRANT语句的基础语法与权限类型,包括SELECT、INSERT等常规权限以及WITH GRANT OPTION转授权功能。特别深入讲解了列级权限的实现方式,通过SELECT(col1,col2)语法实现字段粒度的访问控制,并展示了权限查询与验证方法。本文还对比了ClickHouse 20.4版本前后权限管理体系的差异,为构建安全的多租户数据平台提供了关

xyghehehehe的专栏 440

基于PChmi.dll的PLC报警显示和记录(C#)

本文介绍了如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。通过订阅PLC的报警事件,我们可以实时显示报警信息,并通过日志文件记录报警历史。PLC(可编程逻辑控制器)在工业自动化领域中扮演着重要的角色,而报警显示和记录是PLC应用中常见的需求。本文将介绍如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。当然,这只是实现报警显示和记录的基本框架,具体的实现方式可能因不同的PLC和HMI库而有所差异。你需要根据你所使用的具体库和设备进行相应的调整和修改。

ByteLegend的博客 1673

ios runtime objc_getAssociatedObject&objc_setAssociatedObject用法

/** * Sets an associated value for a given object using a given key and association policy. * * @param object The source object for the association. * @param key The key for the association. *

mr_liu_easy_ios的博客 1204

【WRF-Chem工具】pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量

WW、forever的博客 210

对象关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)

声明: 1、原文地址:http://blog.youkuaiyun.com/onlyou930/article/details/9299169 2、本文是我在自身有需求的时候学习了博主的原文,故在原文的基础上做了修改,如有异议请参考原文。 1、需求,即为何要搜索对象关联的使用 在“阳光随访”app项目中的UIViewController (HUD)类别中有三个函数,函数如下:

BlackWolfSky的博客 1158

[DevExpress]GridControl拖拽行记录排序

DevExpress的GridControl拖拽行记录排序需求效果代码 需求 现在用户对按钮点击排序不满意了, 希望拖拽排序。 重载GridControl控件,对MouseMove、MouseDown、MouseUp事件修改一下。 效果 代码 using System; using System.Drawing; using System.Windows.Forms; using xiaoid.forms; using System.Data; using System.Collections.Gener

德仔 1562

【电机应用控制】——步进电机控制原理(四相五线/两相四线/细分驱动)&驱动器&梯形/S形加减速算法&直线/圆弧插补

步进电机是一种把电脉冲信号转换为角位移(左)或线位移(右)的电动机。两相通常1.8°,三相通常1.2°、无相通常0.72°,角位移=脉冲个数X步距角。在非超载且不超频的情况下,电机的旋转位置只取决于脉冲个数,转速只取决脉冲信号的频率。所以只需要统计脉冲个数和频率,不再需要编码器测速和位置,具有优秀的开环能力,当然也可接编码器反馈速度和位置数据,实现更加精准的闭环控制。永磁式动态性能好,输出力矩大,但步距角大通常7.5°;反应式(磁阻式)结构简单成本低,步距角小一般1.2°,但振动噪音大动态性能差;

weixin_51658186的博客 5万+

iOS 使用objc_setAssociatedObject为分类增加属性-关联对象

使用分类可以为没有源码的类增加方法,但是一般不能增加属性。如果我们为分类添加属性的话,要手动实现所加属性的getter和setter方法,这里使用关联对象的方式完成set和get方法。 我们首先了解@property的意思 生成实例变量 _property 生成 getter 方法 property 生成 setter方法 - setProperty: 如下,为一个分类增加一个名为name...

硬币2014 2525

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索

欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备

琅嬛福地 417

objc runtime之属性扩展(objc_getAssociatedObject,objc_setAssociatedObject,objc_removeAssociatedObjects)...

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用 它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssociat...

weixin_30548917的博客 127

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

iOS学习系列 - 扩展机制category与associative

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用它必须使用的头文件,然后就可以自由使用objc_getAssociatedObject以及objc_setAssociated

dean19900504的专栏 1048

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

iOS runtime方法详解之对象关联objc_setAssociatedObject

Associative References 方法声明: void objc_setAssociatedObject ( id object, const void *key, id value, objc_AssociationPolicy policy ); 描述:使用给定的键和关联策略设置给定对象的关联值。      object:关联的源对象;      key:给定的键;在设置...

小T是我 1794

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS objc_setAssociatedObject 关联对象的学习

今天看了FDTemplateLayoutCell的源码,类别里面相当频繁使用了关联对象,做笔记!!!学套路 主要函数: void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); id objc_getAssociatedObject(id ob...

weixin_34146986的博客 1133

PinterestAnimator 中的 Objective-C 黑魔法:关联对象(Associated Object)实战解析

想给系统类"偷偷"加属性?在 Objective-C 的世界里,**关联对象(Associated Object)** 就是那个让分类(Category)拥有存储能力的"黑魔法"。本文将结合开源项目 **PinterestAnimator**(一款还原 Pinterest 3.0++ 转场动画的 Objective-C 示例工程)的真实源码,一步步拆解关联对象的原理、三个核心 API 以及它在瀑布

gitblog_00184的博客 1101

iOS objc_setAssociatedObject 关联对象

  今天看了FDTemplateLayoutCell的源码,类别里面相当频繁使用了关联对象,做笔记!!!学套路 主要函数: void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); id objc_getAssociatedObject(id ob...

li198847的博客 658

objc_setAssociatedObject/objc_getAssociatedObject

IOS objc_setAssociatedObject/objc_getAssociatedObject                                          category和associative是objective-c的两个扩展机制,category就不介绍了,最常用也就是它。associative是一种发生在运行时的对

罗函 1260

runtime学习之- 关联(association),在分类中添加属性!

一提到runtime,很多人都会产生莫名的恐惧(比如我。。。) 但事实上,runtime有相当一部分内容很简单、很好用,比如今天要讲的关联。 在中,有三个和它有关的方法(是的,一共就三个): objc_setAssociatedObject objc_getAssociatedObject objc_removeAssociatedObjects 顾名思义,

iCodeWoods 1663

iOS的扩展类,扩展属性

  Objective-C有两个扩展机制:Associative和Category。Category用来扩展类方法,Associative用于扩展属性。Associative机制的原理是把两个对象关联起来,让一个对象成为另外一个对象的一部分。它可以在不修改类的定义的前提下为其对象增加存储空间,这在我们无法访问类的源码时(例如给UILable添加一个selected的BOOL属性)是非常有...

angha9275的博客 203

iOS-关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)

关联 关联是指通过key把两个对象互相关联起来,使得其中一个对象为另一个对象的一部分; 使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用; 关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会

ZFJ_张福杰 1868

runtime——增加属性

一、导入包 #import 二、函数介绍 1.objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) 给对象object增加某个属性key,值为value 例:  objc_setAssociatedObject(_wkWebView, @"webT

bigtiger1648的专栏 408

Runtime总结笔记`AssociatedObject`&`Method Swizzling`

Associated Objects 参考文章 NSHipster 主要方法 objc_setAssociatedObjcet: objc_getAssociatedObject: objc_removeAssociatedObjects: 为什么使用 允许开发者在已存在的类里添加自定义属性 如何使用(Objective - C) NSObject + AssociatedObject ....

weixin_41473928的博客 185

iOS开发·备战2022金三银四-runtime原理与实践: 关联对象篇

摘要:编程,只了解原理不行,必须实战才能知道应用场景。本系列尝试阐述runtime相关理论的同时介绍一些实战场景,而本文则是本系列的关联对象篇。本文中,第一节将介绍关联对象及如何关联对象,第二节将介绍关联对象最常用的一个实战场景:为分类添加属性,第三节将介绍关联对象另一个很重要的实战场景:为UI控件(比如,UIAlertView以及UIButton等等)关联事件Block体。 1. 什么是关联对象 1.1 关联对象 分类(category)与关联对象(Associated Object)作为object.

Jul7day的博客 412
上一篇: runtime - 关联对象
下一篇: set与get方法的理解
喵星人Xcode
博客等级 码龄11年 235粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值