0

我找到了我想在我的应用程序中使用的 ac 函数。不幸的是,我的c知识不是很好。第一段代码显示了原始 c 代码,第二段是我对目标 c 的“翻译”。我有 3 个问题希望得到帮助:

  1. 我将变量从其 c 对应物转换为目标 c 对应物是否有效?(我没有编译器警告)
  2. 最后使用 free () 是否可以接受,还是应该在目标 c 中以另一种方式完成

c代码:

unsigned int i, j, diagonal, cost, s1len, s2len;
unsigned int *arr;

char *str1, *str2;

general code...

s1len = strlen(str1);
s2len = strlen(str2);

arr = (unsigned int *) malloc(sizeof(unsigned int) * j);

general code...

free(arr);

目标c代码:

NSUInteger i, j, diagonal, cost, s1len, s2len;
NSUInteger *arr;

const char *str1 = [source cStringUsingEncoding:NSISOLatin1StringEncoding];
const char *str2 = [target cStringUsingEncoding:NSISOLatin1StringEncoding];

general code...

s1len = strlen(str1);
s2len = strlen(str2);

arr = (NSUInteger *) malloc(sizeof(NSUInteger) * j);

general code...

free(arr);
4

4 回答 4

6

Objective-C 是 C 的严格超集,因此您可以使用任何 C 代码而无需任何修改。我建议要么按原样(尽可能)使用 C 代码,要么使用 Objective-C 中的对象重新实现算法。

NSString 到 char

您需要提供的是一种将 Objective-C 对象转换为 C 类型的方法,例如将 NSString* 转换为 char*。

转换是正确的,但您可能希望使用-UTF8String保持所有字符完整,Latin-1 可能会丢失一些信息。utf-8 的缺点是,您的 C 代码可能无法正确使用它。

您最好使用 NSString 的方法之一而不是strlen来获取长度,因为它具有线性运行时间,并且 NSString 的方法可以是恒定的。

// utf-8
int len = [source length];
// latin 1
int len = [source lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];

int 到 NSInteger

没有理由将整数转换为 NSInteger。Apple 已添加此类型以实现 64 位兼容性。NSInteger 是 typedef 的,因此在 32 位平台上它需要 32 位,在 64 位平台上需要 64 位。

我会尝试尽可能少地更改 C 代码。(当原件更新时更容易更新它。)所以只需保持原样。

内存管理

C 的内存管理比 Objective-C 的更基本,但是您似乎知道您使用 malloc 和 free,它们保持不变。无论如何,保留/释放和垃圾收集器仅对对象有用。

于 2010-02-23T09:29:55.750 回答
3

在为 iPhone 开发时,您可以将 Objective C 与纯 C 混合使用。一般来说,使用 Objectvie C,您希望使用更高级别的对象,因此您不需要调用 malloc 和类似的(尽管您当然可以)。

我建议您要么在 Objective C 中从头开始重新实现 C 代码提供的功能,即考虑您需要代码做什么,然后只编写 Objective C 代码 - 而不是尝试更改 C 代码行按行。或者,我会在您的项目中包含纯 C 代码,并从 Objective C 中调用您需要的函数。

于 2010-02-23T09:02:38.713 回答
1

是什么阻止您按原样在代码中使用 c 函数?您可以在 Objective-c 中使用任何 c 函数,它不会导致问题。Cocoa 中的许多函数都是 c 函数(例如NSSearchPathForDirectoriesInDomains().

于 2010-02-23T09:03:12.713 回答
1

您的 C 版本是完全有效的 Objective-C 代码。你不需要翻译它。

于 2010-02-23T09:46:31.433 回答