将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数
Posted
技术标签:
【中文标题】将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数【英文标题】:Converting NSStrings to C chars and calling a C function from Objective-C 【发布时间】:2016-05-18 14:02:41 【问题描述】:我在一个带有各种 NSString
s 的 Objective-C 方法中,我想将它们传递给 C 函数。 C 函数要求 struct
对象为 malloc
'd 以便可以传入 - 此结构包含 char
字段。所以struct
是这样定义的:
struct libannotate_baseManual
char *la_bm_code; // The base code for this manual (pointer to malloc'd memory)
char *la_bm_effectiveRevisionId; // The currently effective revision ID (pointer to malloc'd memory or null if none effective)
char **la_bm_revisionId; // The null-terminated list of revision IDs in the library for this manual (pointer to malloc'd array of pointers to malloc'd memory)
;
这个结构然后用在下面的 C 函数定义中:
void libannotate_setManualLibrary(struct libannotate_baseManual **library) ..
这就是我需要从 Objective-C 调用的函数。
所以我有各种NSString
s,我基本上想在其中传递,以表示字符 - la_bm_code
、la_bm_effectiveRevisionId
、la_bm_revision
。我可以使用[NSString UTF8String]
将它们转换为const char
s,但我需要char
s,而不是const char
s。
我还需要为这些字段做合适的malloc
,但显然我不需要担心之后释放内存。 C 不是我的强项,虽然我很了解 Objective-C。
【问题讨论】:
【参考方案1】:strdup()
是您在这里的朋友,因为只需一个简单的步骤,malloc()
s 和 strcpy()
s 都会为您服务。它的内存也使用free()
释放,它会为您完成const char *
到char *
的转换!
NSString *code = ..., *effectiveRevId = ..., *revId = ...;
struct libannotate_baseManual *abm = malloc(sizeof(struct libannotate_baseManual));
abm->la_bm_code = strdup([code UTF8String]);
abm->la_bm_effectiveRevisionId = strdup([effectiveRevId UTF8String]);
const unsigned numRevIds = 1;
abm->la_bm_effectiveRevisionId = malloc(sizeof(char *) * (numRevIds + 1));
abm->la_bm_effectiveRevisionId[0] = strdup([revId UTF8String]);
abm->la_bm_effectiveRevisionId[1] = NULL;
const unsigned numAbms = 1;
struct libannotate_baseManual **abms = malloc(sizeof(struct libannotate_baseManual *) * (numAbms + 1));
abms[0] = abm;
abms[1] = NULL;
libannotate_setManualLibrary(abms);
祝你好运,你会需要它的。这是我见过的最糟糕的界面之一。
【讨论】:
太棒了,谢谢。现在正在尝试。顺便说一句,是的 - 需要传入一个指针数组,所以也要看看。以上是关于将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何将原始 NSData 以及一些 NSStrings 发布到我的服务器?