【问题标题】:Access object created in Objective C在 Objective C 中创建的访问对象
【发布时间】:2019-01-05 05:34:21
【问题描述】:

我们有一个 Objective C 库,可以创建用于 Swift 代码的对象。

该函数将对象作为 id 返回。这是 Objective C 头文件 (Clazz.h) 中的声明。头文件已根据互操作性的要求在桥接头中公开。

+ (id)getObject;

返回的指针是 AVAssetWriter* 的一个实例。要在 Swift 中访问此 API,我按照以下帖子中的步骤操作: Objective-C pointer and swift

这是 Swift 3 代码消费者代码:

let obj = (Clazz.getObject() as! UnsafeMutableRawPointer).assumingMemoryBoundTo(to: AVAssetWriter.self).pointee

它构建得很好。但是,执行此代码时,应用程序似乎崩溃了。

在 Clazz.h 中,我将函数声明为:

+ (AVAssetWriter*)getObject();

并尝试在 Swift 中使用它,

let obj = Clazz.getObject() as AVAssetWriter

代码构建良好,但执行时失败。

我们如何在 Swift 中访问 Objective C 创建的对象?

请注意,我能够检查 swift 代码中的值,问题不在于桥接。此外,内存位置没有悬空。

【问题讨论】:

  • 显而易见的答案是重写Objective C 声明,使其返回实际类型而不是id。你说as AVAssetWriter 在运行时失败了。发生了什么?它是如何失败的?
  • 对不起......它没有在那里失败。类型转换有效,但在检查它时,它显示了一个长值和 ObjectiveC.NSObject 而不是 AVAssetWriter。当我尝试将它用作 AVAssetWriter 并访问它的一个属性时它失败了。
  • 那么当您尝试访问该属性时,那个错误是什么?
  • 我发现了这个问题...作为一个 java 开发人员,我习惯于用变量名来声明类型,以至于我忘了提到 obj 作为 AVAssetWriter 类型。谢谢!
  • 我不确定。也许问另一个问题,显示您的代码和编译器的确切消息

标签: ios objective-c swift3 interop


【解决方案1】:

通过如下声明 obj 变量,一切正常

let obj:AVAssetWriter = Clazz.getObject() as AVAssetWriter

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多