c++ - 在 Swift 中的 Objective-C++ 类中设置变量 --> 意外的 nil 崩溃

标签 c++ ios objective-c swift opencv

我正在开发一个使用 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/

相关文章:

c++ - 在 C++ 标准中未指定的 std::basic_streambuf 中寻找吗?

ios - 仅适用于 pod 文件夹的 Swift Auto Documentation jazzy

iOS8 - 如何在 iOS 8 中更改长按手势的灵敏度

objective-c - 应用程序在后台时不显示 iOS UILocalNotification

iphone - NSUnknownKeyException - Storyboard还是代码?

objective-c - Xml 解析 NSString 为 NSInteger

c++ - 为什么 unordered_set 的元素对于自定义 equal_to 不是唯一的

c++ - PostgreSQL无法访问

c++ - std::thread对象构造过程中的细节

ios - 如何打开保存在我的笔记本中的数据(使用核心数据模型保存)