OC扩展CBPeripheral中Swift实例引用的内存管理问题咨询
问题解答
问题1:CBPeripheral实例释放时,bleManagerStore和currentSeq的引用计数是否自动减少?如何解决?
不会自动减少。你当前代码里的bleManagerStore和currentSeq是全局变量,它们的生命周期和整个应用进程绑定,和单个CBPeripheral实例无关。当CBPeripheral实例被释放时,全局变量依然会持有对对象的强引用,导致引用计数无法下降,最终引发内存泄漏。
正确的做法是将这两个变量改为CBPeripheral的关联对象,让它们和CBPeripheral实例绑定,实例释放时关联对象会被自动清理。修改后的Objective-C扩展代码如下:
#import <objc/runtime.h> @implementation CBPeripheral(com_megster_ble_extension) // 定义关联对象的唯一标识key static const void *kBleManagerStoreKey = &kBleManagerStoreKey; static const void *kCurrentSeqKey = &kCurrentSeqKey; - (void)setBleManagerStore:(BleManagerStore *)store { objc_setAssociatedObject(self, kBleManagerStoreKey, store, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (BleManagerStore *)getBleManagerStore { return objc_getAssociatedObject(self, kBleManagerStoreKey); } - (void)setSeq:(NSNumber *)seq { objc_setAssociatedObject(self, kCurrentSeqKey, seq, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSNumber *)getSeq { return objc_getAssociatedObject(self, kCurrentSeqKey); } @end
关键说明:
- 使用
objc_setAssociatedObject将对象与CBPeripheral实例绑定,OBJC_ASSOCIATION_RETAIN_NONATOMIC表示对关联对象持强引用(ARC下自动管理引用计数),采用非原子性访问。 - 当CBPeripheral实例被释放时,系统会自动移除所有关联对象,对应的引用计数会正常下降,避免内存泄漏。
问题2:是否需要手动释放在Objective-C中引用的Swift实例?
不需要。在ARC(自动引用计数)环境下,Objective-C和Swift的内存管理体系互通:
- Swift实例被Objective-C代码引用时,ARC会自动维护其引用计数,当没有任何强引用指向该实例时,它会被自动释放。
- 只有在早已被淘汰的MRC(手动引用计数)环境下,才需要手动调用
release等方法管理内存,而当前iOS项目默认都是ARC模式。
内容的提问来源于stack exchange,提问作者Dodolong
相关产品推荐
相关产品推荐

