我正在开发一个使用 OpenCV 的项目,这迫使我扩展到 C++ 和 Objective-C 领域。我构建了一个小型 Objective-C 类,它从 OpenCV 框架调用 Objective C++ 函数,并将其桥接到 Swift 中。
在 Objective-C 类中,我有一些 NSInteger 成员,我希望能够从 UI 更改它们。但是当我尝试获取或设置它们时,它会崩溃,并出现熟悉的在解包可选值时意外发现 nil
。
我毫不怀疑这是一个低级错误,但我已经转了一段时间了,但很难缩小范围。如果有人可以看看我的类(class)并告诉我出了什么问题,那就太好了。
.h 文件 @interface OpenCVWrapper:NSObject
// This is a singleton for providing global access to the OpenCV Wrapper
+ (OpenCVWrapper *)sharedInstance;
- (UIImage *)processImageWithOpenCV:(UIImage*)inputImage;
- (void)setupVideoCamera:(UIView*) parentView;
// Filtering properties
@property (atomic, assign) NSInteger hMin;
@property (nonatomic, assign) NSInteger hMax;
@property (nonatomic, assign) NSInteger sMin;
@property (nonatomic, assign) NSInteger sMax;
@property (nonatomic, assign) NSInteger vMin;
@property (nonatomic, assign) NSInteger vMax;
#ifdef __cplusplus
@property (nonatomic, retain) CvVideoCamera* videoCamera;
@property (nonatomic, retain) VideoHandler* videoHandler;
#endif
@end
.mm 文件
@implementation OpenCVWrapper : NSObject
@synthesize videoHandler;
@synthesize videoCamera;
@synthesize hMin;
@synthesize hMax;
@synthesize sMin;
@synthesize sMax;
@synthesize vMin;
@synthesize vMax;
// This is how a singlegton is created in Objective-C (or so I'm told)
static OpenCVWrapper *sharedInstance = nil;
+ (OpenCVWrapper *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}
// Initialize the variables
// hue is from 0 to 180, saturation and value go from 0 to 255
-(id) init {
self = [super init];
self.hMin = 0;
self.sMin = 0;
self.vMin = 0;
self.hMax = 180;
self.sMax = 255;
self.vMax = 255;
return self;
}
然后,我有导入 .h 文件的桥接 header ,并且编译器可以识别 OpenCVWrapper.sharedInstance
,但如果我尝试获取或设置 sharedInstance.hMin
它会发现意外的 nil 并崩溃。
任何指点将不胜感激!
最佳答案
该问题与这些类无关。有一个悬空的 Storyboard引用导致了崩溃。
@IBOutlet weak var slider1:UISlider!
@IBOutlet weak var slider2:UISlider!
@IBAction func sliderChanged(sender:UISlider) {
switch sender {
case slider1: OpenCVWrapper.sharedInstance().hMin = NSInteger(sender.value)
case slider2: OpenCVWrapper.sharedInstance().hMax = NSInteger(sender.value)
}
}
sliderChanged
函数被调用,所以我忽略了我忘记连接 socket 的事实,并假设 nil 与访问共享实例有关。
感谢所有花时间查看我的代码并提供建议的人。
关于c++ - 在 Swift 中的 Objective-C++ 类中设置变量 --> 意外的 nil 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37894712/