ios - 将 Objective-C 代码转换为 Swift 时出现 EXC_BAD_ACCESS

标签 ios objective-c swift

我尝试在我的项目中使用 Objective-C 框架,但在将 Objective-C 代码转换为 Swift 时遇到了一些问题。

API之一:

- (void)ioFrameChannel:(PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(PTData*)payload

payload.data 是这样的结构:

typedef struct _PTExampleTextFrame {
  uint32_t length;
  uint8_t utftext[0];
} PTExampleTextFrame;

我想获取 PTExampleTextFrame.utftext 这是从框架发送的消息

因此,我创建了一个本地 struct:

struct CPTExampleTextFrame {
    var length: UInt32
    var utf8text: UnsafePointer<UInt8>
}

然后这样写:

var textFrame = UnsafePointer<CPTExampleTextFrame>(payload.data).memory
textFrame.length = CFSwapInt32(textFrame.length)
print(textFrame.length) // textFrame.length is correct!
let message = NSString(bytes: textFrame.utf8text, length: Int(textFrame.length), encoding: NSUTF8StringEncoding) // error
print(message)

But I get an error: EXC_BAD_ACCESS(code=1,address=0x31)

谁能告诉我这是什么问题?

我还给你在 Objective-C 中的框架示例:

- (void)ioFrameChannel:(PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(PTData*)payload {
  if (type == PTExampleFrameTypeTextMessage) {
    PTExampleTextFrame *textFrame = (PTExampleTextFrame*)payload.data;
    textFrame->length = ntohl(textFrame->length);
    NSString *message = [[NSString alloc] initWithBytes:textFrame->utf8text length:textFrame->length encoding:NSUTF8StringEncoding];
    [self appendOutputMessage:[NSString stringWithFormat:@"[%@]: %@", channel.userInfo, message]];
  } else if (type == PTExampleFrameTypePing && peerChannel_) {
    [peerChannel_ sendFrameOfType:PTExampleFrameTypePong tag:tag withPayload:nil callback:nil];
  }
}

最佳答案

由于 Objective-C 是 C 的超集,我强烈建议您将与 C 接口(interface)的代码保留为 Objective-C 代码。直接连接 C 和 Swift 绝对是一件痛苦的事情。

而一个char数组和一个指向char的不安全可变指针显然是不兼容的。

关于ios - 将 Objective-C 代码转换为 Swift 时出现 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894204/

相关文章:

c# - 如何在 Xamarin iOS 项目中使用签名程序集 (PCL)?

objective-c - cocoa:多个按钮设置图片,Tab效果

json - 如何在 swift 中从 JSON 获取特定值

ios - 使用径向渐变作为 UIView 的扩展

json - 试图解析 json,似乎无法解析数组内部的数组

ios - _BSMachError : (os/kern) invalid capability (20) & _BSMachError: (os/kern) invalid name (15)

ios - iOS 6 垂直滚动时 UIWebView 中的背景闪烁

ios - IBM Worklight - WL.App.getDeviceLanguage() API 方法在 iOS 中不返回正确的语言代码

ios - UICollectionViewController 中的 Flipped CollectionView 被 Navigation Controller 覆盖

objective-c - 如何在 Mac App Store 上的 os x 应用程序中捆绑命令行实用程序(使用沙盒授权)