【发布时间】:2016-06-04 16:26:17
【问题描述】:
我正在制作一个用 swift 和 c 编写的字典应用程序。我正在使用 c、.h 和 .c 来搜索我拥有的字典文本文件以查找特定特征,这取决于用户输入到我称之为 DictionaryViewController 的内容。将输入数据传递给 c 函数并确定返回 char* 的方法很好,但是,在某些输入上,我创建的 char* 不会进入我的 swift 文件并产生一个 nil 值。如何确定swift可以访问我从c文件分配的内存?
//.c file
char* searchDictionary(char* u_input) {
char* returnValue = malloc(sizeof(char)*largeNumber);
//implementation
return (returnValue);
}
//.h file
char* searchDictionary(char* u_input);
//.swift file
var uin = userinput.text
let uinn = (uin as NSString).UTF8String
var uinnn = UnsafeMutablePointer<Int8>(uinn)
var out = UnsafeMutablePointer<Int8>.alloc(1)
out = searchDictionary(uinnn)
//out sometimes gets the value returned from searchDictionary
dictoutput.text = NSString(CString: out, encoding: NSUTF8StringEncoding)
【问题讨论】:
-
我认为这与您的问题无关,而且我什至不了解 Swift,但我预计
var out = UnsafeMutablePointer<Int8>.alloc(1)会导致少量内存泄漏。 -
您遗漏了太多代码。制作一个可编译的完整示例来演示该问题。如果问题只是关于从 C 文件中获取字符串,则无需包含有关
dictoutput或userinput的任何内容。问题很可能出在您未显示的代码中,并且与此问题无关。 -
我已将
var out = UnsafeMutablePointer<Int8>.alloc(1)更改为 swift 中的正常声明var out : UnsafeMutablePointer<Int8>!。我强制分配,因为我认为 swift 的编译方式存在问题。从我的 c 文件中获取 char * 没有问题。在我的函数退出之前,我已经打印出 strlen 和 data 的内容,并且当我在 swift 中输出长度时,所有端口都结束了。但是,在特定输入上,我无法正常从我的 c 文件中获取 strlen 和数据,但是当我快速打印长度和数据时,我得到 nil 值。 -
今天,我将尝试将输出写入文件并以这种方式快速访问我的 c 输出。我最初使用 c 以便我可以将 getc 与我的文件一起使用。我认为这可能是 swift 编译器的一个错误。
-
我已经成功地将 c 函数返回的内容输出到一个文本文件中。即使文本文件具有正确的值,swift 仍然无法识别某些输出。我认为将 NSString 转换为 nil 值存在一个奇怪的编码问题。
标签: c swift memory-management c-strings bridging-header