You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:25:21