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
相关产品推荐
相关产品推荐

