Swift/OC混编项目NSNotificationCenter观察者Release失效(Xcode12)
混编项目Release模式下
NSNotification通知回调失效问题 问题背景
在Swift与Objective-C混编项目中遇到特定异常:
- 在Objective-C类中通过
NSNotificationCenter添加通知观察者 - 在Swift类中触发对应通知
- Debug模式下功能完全正常,打包Release模式IPA后通知回调完全失效
经版本对照测试:Xcode11版本下该功能在Debug、Release两种模式下均运行正常,仅在Xcode12版本构建的Release包中出现失效问题。
相关示例代码
Swift类(按钮点击触发通知)
@IBAction func btnBackTapped(_ sender: Any) { let testManager = TestManager.init(window: appdel?.window, andApplicationViewController: splitViewController!) NotificationCenter.default.post(name: NSNotification.Name(rawValue:"test"), object: nil) }
Objective-C类(注册通知观察者)
-(id)initWithWindow:(UIWindow *)w andApplicationViewController:(UIViewController *)avc { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(testMethod:) name:@"test" object:nil]; } return self; } -(void)testMethod:(NSNotification *)notification { NSLog(@"testMethod called "); }
问题定位与解决方案
最终定位到的核心原因:TestManager类的对象是按钮点击方法内的局部创建变量,通知触发时该局部对象已经被系统销毁,因此注册的观察者回调无法被触发。
将TestManager对象改为被全局强引用持有后,Debug、Release两种模式下的功能均恢复正常。
实用调试技巧
这类仅Release模式下失效的问题往往排查成本极高——此前就因为不清楚如何直接在Xcode中运行Release模式调试,反复打包测试耗费了数小时才定位问题。实际上无需反复打包IPA安装测试,可直接在Xcode中运行Release构建调试:
- 进入「编辑Scheme」面板
- 选择Run模块的「Info」标签页
- 在「构建配置」下拉选项中切换为Release模式,即可直接在真机/模拟器上运行Release版本,同步设置断点排查问题
待技术同行解答的疑问
当TestManager对象为方法内局部变量、未被全局持有时,为什么Debug模式下通知回调仍能正常触发,Release模式下却会失效?
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

