首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用objc_setAssociatedObject实现Objective-C的NSString内存泄漏

objc_setAssociatedObject是Objective-C中的一个函数,用于实现对象之间的关联关系。它可以将一个对象与另一个对象关联起来,并且不会影响到对象的内存管理。

在Objective-C中,使用objc_setAssociatedObject函数可以给一个对象动态地添加关联对象。这个关联对象可以是任意类型的,比如NSString、NSNumber等。通过这种方式,我们可以给一个已有的类添加额外的属性,而不需要修改原有的类定义。

使用objc_setAssociatedObject函数可以避免NSString内存泄漏的问题。当我们需要给一个NSString对象添加关联对象时,可以使用这个函数将关联对象与NSString对象关联起来。这样,在NSString对象被释放时,关联对象也会被自动释放,从而避免了内存泄漏的问题。

objc_setAssociatedObject函数的使用方法如下:

代码语言:txt
复制
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

其中,参数object是要添加关联对象的目标对象;参数key是一个唯一的标识符,用于区分不同的关联对象;参数value是要关联的对象;参数policy是关联策略,用于指定关联对象的内存管理方式。

objc_setAssociatedObject函数的应用场景包括但不限于:

  1. 给已有的类添加额外的属性,而不需要修改原有的类定义;
  2. 在分类中为已有的类添加属性;
  3. 在运行时动态地给对象添加属性。

腾讯云提供了丰富的云计算产品,可以满足各种不同的需求。在使用objc_setAssociatedObject函数时,可以考虑使用腾讯云的云服务器CVM来部署应用程序,使用云数据库MySQL来存储数据,使用云存储COS来存储文件等。

更多关于腾讯云产品的信息,可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

慎用公共变量

出现问题,解决问题,Objective-C针对上述问题,提供了一个解决方案:即使用关联对象(Associated Object); 我们可以把关联对象想象成一个Objective-C对象(如字典),这个对象通过给定...这种情况下,先前关联对象会被妥善地处理掉,并且新对象会使用它内存; 3、移除关联对象: objc_removeAssociatedObjects(anObject); 或者使用objc_setAssociatedObject...注意Block对象关联内存管理策略-Copy; 然后,处理单击事件,具体实现如下: - (void) JL_handleActionForTapGesture:(UITapGestureRecognizer...优化完善 但是,还是有一点不太完美,代码过于松散,按照上述方式去应用到项目中,会写不少重复代码,我们需要封装一下,并不暴露#import 引用,具体实现如下: 重新定义一套表征内存策略枚举...封装方法重写上述方法: //定义绑定对象Key static NSString *const kJLActionHandlerTapGestureKey = @"JLActionHandlerTapGestureKey

57320

慎用公共变量~~

我们可以把关联对象想象成一个Objective-C对象(如字典),这个对象通过给定key连接到类一个实例上。不过由于使用是C接口,所以key是一个void指针(const void *)。...我们还需要指定一个内存管理策略,以告诉Runtime如何管理这个对象内存。...5、但是,还是有一点不太完美,代码过于松散,按照上述方式去应用到项目中,会写不少重复代码,我们需要封装一下,并不暴露#import 引用,具体实现如下: 重新定义一套表征内存策略枚举...NSString参数就可以了,接口方法变得更优雅简洁一些。...6、封装方法重写上述方法: //定义绑定对象Key static NSString *const kJLActionHandlerTapGestureKey = @"JLActionHandlerTapGestureKey

77340
  • property属性相关小记

    Objective-C对象所占内存总是分配在“堆空间”,且堆内存由开发者释放,即release; 由编译器管理自动释放,在方法中定义变量通常在栈内。...因为他总是在超出他作用域时被自动销毁了 在objective-c中只支持一个类型对象:block 堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。...堆对象: 优点:可以自己控制对象生命周期。 缺点:需要程序员手动释放,容易造成内存泄漏。...原理:weak对象会放入一个hash表中,weak指向对象内存地址作为key,因此该对象引用计数为0时就回dealloc,在hash表中找到所有以该对象内存地址为keyweak对象,从而置为nil...protocol中是希望遵守协议中对象实现该属性;category需要增加属性实现时,需要分别使用两个函数:objc_setAssociatedObject和objc_getAssociatedObject

    1.1K20

    iOS进阶之runtime作用

    前言 Runtime基本是C和汇编写,可见苹果为了动态系统高效而作出努力。你可以在这里下到苹果维护开源代码。...Objective-C 从三种不同层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码,通过 Foundation 框架NSObject类定义方法,通过对 runtime...自动归档和自动解档 5.动态添加对象成本变量和成员方法 作用:当硬件内存过小时候,如果我们将每个方法都直接加到内存当中去,但是几百年不用一次,这样就造成了浪费,所有采取动态添加 6.实现字典和模型自动转换...,证明已经动态交换成功 二、为分类添加属性 一般情况下,分类不可以添加属性,但runtime却可以实现 - (NSString *)height { return objc_getAssociatedObject...(self, @"height"); } - (void)setHeight:(NSString *)height { objc_setAssociatedObject(self, @"height

    63090

    Objective-c 知识总结 -- @property

    从 Xcode 4.4 开始,当我们 @property 进行属性声明时候,编译器就会自动帮我们生成相应 实例变量 + 存取方法声明 + 存取方法实现; 那什么情况下会破坏这种自动合成过程呢?...木有哦 都说是类属性了,肯定类调用嘛,试试啊~~~ ? 类方法提示证明有相关方法声明 ? 外部调用 ? 内部调用 好兴奋啊~~~ ?...增加相应类方法 再试一下, ? 成功了 6. 空类关键字解析 它们只能用于指针变量,当然实例对象肯定是可以咯 ? ?.../** * 返回实例变量内存偏移量 * * @param v 实例变量 * * @return 实例变量内存偏移量 * * @note 如果是对象类型实例...(关联对象) 重复:如果声明并实现了属性存取方法就等同于实现了属性; objc_setAssociatedObject --> 设置指定实例对象关联值 /** * 根据实例对象(object

    1.4K31

    深入浅出 Runtime(一):初识

    相关链接 Runtime 简介 Runtime 是一个C、汇编编写运行时库,包含了很多 C 语言 API,封装了很多动态性相关函数; Objective-C 是一门动态运行时语言,允许很多操作推迟到程序运行时再进行...OC动态性就是由 Runtime 来支撑和实现,Rumtime 就是它核心; 我们平时编写OC代码,底层都是转换成了 Runtime API 进行调用。...编译时:编译器将程序代码编译成计算机能够识别的语言,只进行一些简单语法检查; 运行时:代码跑起来,被装载到内存中去,此时如果出错会导致程序崩溃。...举例 对于 NSString *string = [[NSMutableArray alloc]init]; 编译时:编译器进行类型检查时候,由于给一个NSString类型指针赋值是一个NSMutableArray...但是编译器会将 string当作NSString实例,所以string对象调用NSString方法,编译没有任何问题,而调用NSMutableArray方法,编译会直接报错。

    98620

    【IOS开发高级系列】Objective-c Runtime专题总结

    Objective-CRuntime铸就了它动态语言特性,这些深层次知识虽然平时写代码少一些,但是却是每个Objc程序员需要了解。         ...Runtime系统是一个由一系列函数和数据结构组成,具有公共接口动态共享库。头文件存放于/usr/include/objc目录下。许多函数允许你纯C代码来重复实现OC中同样功能。...3 消息         OC中发送消息是中括号([ ])把接收者和消息括起来,而直到运行时才会把消息与方法实现绑定。...,也就是 OC 内存管理引用计数机制。...7.3 具体使用 7.3.1 创建关联         创建关联要使用到Objective-C运行时函数:          objc_setAssociatedObject来把一个对象与另外一个对象进行关联

    36030

    面经之《招聘一个靠谱iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    如何让自己 copy 修饰符?如何重写带 copy 关键字 setter? 若想令自己所写对象具有拷贝功能,则需实现 NSCopying 协议。... weak 指向对象内存地址作为 key,当此对象引用计数为0时候会 dealloc,假如 weak 指向对象内存地址是a,那么就会以a为键, 在这个 weak 表中搜索,找到所有以a为键...在b非nil时,a和b指向同一个内存地址,在b变nil时,a变nil。此时向a发送消息不会崩溃:在Objective-C中向nil发送消息是安全。...猜想runloop内部是如何实现? objc使用什么机制管理对象内存? ARC通过什么方式帮助开发者管理内存?...KVCkeyPath中集合运算符如何使用? KVC和KVOkeyPath一定是属性么? 如何关闭默认KVO默认实现,并进入自定义KVO实现? apple什么方式实现对一个对象KVO?

    997100

    Objective-C Runtime 一些基本使用

    在上一篇文章《Objective-C Runtime详解》中我们探讨了Runtime基本原理,这篇文章我们将总结一下Runtime一些基本使用 目录 查询方法 给分类添加属性 更换代码实现方法...可以了解到,.cxx_destruct 方法原本是为了C++对象析构,ARC借用了这个方法插入代码实现了自动内存释放工作 关于 .cxx_destruct 可以参考这篇文章:ARC下dealloc过程及...、nonatomic等参数: 这些常量对应着引用关联值政策,也就是 Objc 内存管理引用计数机制。...上面代码中第二个参数写是 _cmd,等价于@selector(name) Objective-C编译器在编译后会在每个方法中加两个隐藏参数: 一个是_cmd,当前方法一个SEL指针。...另一个就是比较多self,指向当前对象一个指针。

    1.2K80

    iOS开发·runtime原理与实践: 关联对象篇(Associated Object)(应用场景:为分类添加“属性”,为UI控件关联事件Block体,为了不重复获得某种数据)

    什么是关联对象 1.1 关联对象 分类(category)与关联对象(Associated Object)作为objective-c扩展机制两个特性:分类,可以通过它来扩展方法;Associated...void *key:关联key,要求唯一 id value:关联对象 objc_AssociationPolicy policy:内存管理策略 2....但是,如果我们在分类中写一个属性,则会给一个警告,分类中 @property 并没有为我们生成实例变量以及存取方法,而需要我们手动实现。..._cmd在Objective-C方法中表示当前方法selector,正如同self表示当前方法调用对象实例。这里强调当前,_cmd作用域只在当前方法里,直指当前方法名@selector。...在分类中@property不会生成_变量,也不会实现getter和setter方法。我们实现只是getter和setter方法,并没有自动生成下划线开头变量! 3.

    2.7K20

    iOS 面试策略之语言工具-Objective-C

    Objective-C 是苹果为 iOS 和 Mac 开发量身定制语言。它随着 iPhone 出现而大火,直到今天国内外大多数 App 依然是 Objective-C 在写。...这是内存泄漏一种情况。...加分回答: 内存泄漏可以 Xcode 中 Debug Memory Graph 去检查: [image] 同时 Xcode 也会在 runtime 中自动汇报内存泄漏问题: [image] 3.请说明并比较以下关键词...而所谓 block,就是 Objective-C 对于闭包实现。闭包就是没有名字函数,或者理解为指向函数指针。 7.什么是 block?它和代理区别是什么?...因为 NSString 是不可变数据类型,它有对应 NSMutableString 数据类型, strong 来修饰会有 NSString 被修改可能性。

    67420

    【iOS】关联对象详解

    因为category中添加property不会生成带下划线"_"成员变量以及getter和setter实现。所以可以通过关联对象实现getter和setter。...设置关联对象时键是个“不透明指针(opaque pointer)”。在设置关联对象时,若想另两个键匹配到同一个值,则二者必须是完全相同指针才行。...鉴于此,存取关联对象key通常是一个静态全局变量。 注意: 存取关联对象key通常是一个静态全局变量。 使用关联对象必须导入#import 框架。...关联对象存储需要指明存储策略。和property类似,objc以枚举方式提供了存储策略。本质上就是关联对象内存管理语义。...以下摘抄自《Effective Objective-C 2.0 编写高质量iOS与OS X代码52个有效方法》。

    7.7K40

    iOS 小技能:Method Swizzling (交换方法IMP)

    前言 利用Objective-C Runtimee动态绑定特性,将一个方法实现与另一个方法实现进行交换。...中,一个类是一个名为objc_class结构体表示,它定义如下 https://developer.apple.com/documentation/objectivec/objective-c_runtime...Objective-C 选择器名字也是作为驻留字符串储存在一个共享字符串池当中。...Selector 是一个在运行时被注册(或映射)C类型字符串,由编译器产生并且在类被加载进内存时由runtime自动进行名字和实现映射。...在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息唯一依据是selector名字。因此我们可以在运行时偷换selector对应方法实现,达到给方法挂钩目的。

    1.6K10

    弱引用堵住内存泄漏全局 Map 造成内存泄漏找出内存泄漏HPROF 输出,显示 Map.Entry 对象分配点弱引用WeakReference.get() 一种可能实现用 WeakHashMa

    找出内存泄漏 程序有内存泄漏第一个迹象通常是它抛出一个 OOM,或者因为频繁GC而表现出糟糕性能。 幸运是,垃圾收集可以提供能够用来诊断内存泄漏大量信息。...下述代码展示了一个有内存泄漏程序。MapLeaker 在线程池中处理任务,并在一个 Map 中记录每一项任务状态。...持续上升内存使用趋势 确信有了内存泄漏后,下一步就是找出哪种对象造成了这个问题 所有内存分析器都可以生成按照对象类进行分解堆快照。...有一些很好商业堆分析工具,但是找出内存泄漏不一定要花钱买这些工具 —— 内置 hprof 工具也可完成这项工作。... WeakHashMap 堵住泄漏 在 SocketManager 中防止泄漏很容易,只要用 WeakHashMap 代替 HashMap 就行了,如下面代码所示。

    1.5K61

    关于 循环引用问题

    三.检测循环引用造成内存泄漏 我们在编写项目时,并不是所有的循环引用编译器都会提示,所以在做完项目后,我们还需要检测项目中是否有内存泄漏情况,以下是几种检测方法。...Analyze主要分析以下四种问题: 1、逻辑错误:访问空指针或未初始化变量等; 2、内存管理错误:如内存泄漏等; 3、声明错误:从未使用过变量; 4、Api调用错误:未包含使用库和框架。...内存泄漏 使用Leak动态分析,我们可以快速定位到内存泄漏代码,方便我们检测!...使用:使用pods或者下载导入项目,运行,通过提示框和控制器台打印来提示哪里有内存泄漏问题。 ?...内存泄漏提示 4.自定义检测工具 需求:检测UIViewController 是否发生内存泄漏。 思路:我们需要检测控制器对象在POP后是否还存活,存活则表示有内存泄漏

    3.3K20

    OC - Association 关联对象

    关联对象 1.1 使用场景 默认情况下,由于分类底层结构限制,不能直接给 Category 添加成员变量,但是可以通过关联对象间接实现 Category 有成员变量效果。...Q:如果 object 被销毁,那它所对应 ObjectAssociationMap 是否也会自动销毁? 答案是肯定。 Q:如果没有关联对象,怎么实现 Category 有成员变量效果?...创建一个全局字典,将self对象在内存地址作为key。...缺点:① 内存泄漏问题:全局变量会一直存储在内存中;    ② 线程安全问题:可能会有多个对象同时访问字典,加锁可以解决;    ③ 每添加一个成员变量就要创建一个字典,很麻烦。...NSString *key = [NSString stringWithFormat:@"%@",self]; return [heights_[key] intValue]; }

    1.3K10
    领券