首页
学习
活动
专区
工具
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

58120

慎用公共变量~~

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

78740
  • property属性相关小记

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

    63890

    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的方法,编译会直接报错。

    1K20

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

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

    38130

    面经之《招聘一个靠谱的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通过什么方式帮助开发者管理内存?...KVC的keyPath中的集合运算符如何使用? KVC和KVO的keyPath一定是属性么? 如何关闭默认的KVO的默认实现,并进入自定义的KVO实现? apple用什么方式实现对一个对象的KVO?

    1K100

    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.9K20

    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 面试策略之语言工具-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 被修改的可能性。

    68420

    【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.8K10

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

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

    1.6K61

    关于 循环引用问题

    三.检测循环引用造成的内存泄漏 我们在编写项目时,并不是所有的循环引用编译器都会提示,所以在做完项目后,我们还需要检测项目中是否有内存泄漏的情况,以下是几种检测方法。...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.4K10
    领券