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

Swift4从Objective-C对象读取数据异常:返回值为0问题排查

Swift调用Objective-C实例返回异常的原因与解决办法

核心问题

你在Swift代码里通过var AVR = rAVRview()创建了一个全新的rAVRview实例,这个实例并没有经过nib的加载流程——也就是说它不会触发awakeFromNib方法,因此它的motorsteps变量保持默认的0值。而你提到的、在awakeFromNib里被初始化为48的motorsteps,属于nib文件中另一个完全独立的rAVRview实例,你的Swift代码根本没用到这个实例。

解决方案

方案1:通过IBOutlet关联nib中的实例

不要在Swift里手动初始化AVR,而是用IBOutlet绑定nib里的rAVRview对象:

@IBOutlet weak var AVR: rAVRview!

打开对应的nib文件,将界面上的rAVRview控件拖拽到这个IBOutlet上完成关联。这样Swift代码拿到的就是经过awakeFromNib初始化的那个实例,调用AVR.motorsteps()就能正确获取到48。

方案2:统一初始化逻辑

如果rAVRview存在非nib加载的场景,需要把motorsteps的初始化逻辑覆盖到所有初始化方法中,而不是仅依赖awakeFromNib。在Objective-C的rAVRview类中添加以下代码:

- (instancetype)init {
    self = [super init];
    if (self) {
        _motorsteps = 48;
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        _motorsteps = 48;
    }
    return self;
}

这样不管是从nib加载(触发initWithCoder:),还是Swift里直接初始化(触发init),motorsteps都会被正确设置为48。

额外验证

你提到“Swift调用后AVR中原motorsteps仍为48”,这里的“原motorsteps”属于nib中的独立实例,和Swift代码里创建的AVR对象毫无关联,两者的变量值互不影响,这也进一步证实了是实例不匹配导致的问题。

内容的提问来源于stack exchange,提问作者heimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:36:03