我找到了一个我希望在我的应用中使用的c函数。不幸的是,我的知识并不是很好。第一部分代码显示原始c代码,第二部分代表我对目标c的“翻译”。我有3个问题,我将非常感谢您的帮助:
c code:
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);
答案 0 :(得分:6)
Objective-C是C的严格超集,因此您可以使用任何C代码而无需任何修改。我建议使用C代码(尽可能)或使用Objective-C中的对象重新实现算法。
您需要提供的是将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转换为NSIntegers。 Apple已添加此类型以实现64位兼容性。 NSInteger是typedef'd,因此在32位平台上它需要32位,64位平台需要64位。
我尝试尽可能少地更改C代码。 (当原始版本更新时,更容易更新它。)所以请保持原样。
C的内存管理比Objective-C更基本,但是你似乎知道你使用malloc和free,它只是保持不变。保留/释放和垃圾收集器只对对象有用。
答案 1 :(得分:3)
在为iPhone开发时,您可以将Objective C与纯C混合使用。一般来说,使用Objectvie C你想要使用更高级别的对象,因此你不需要调用malloc和类似的东西(当然你可以)。
我建议您重新实现C代码在Objective C中从头开始提供的功能,即考虑您需要代码执行的操作然后只编写Objective C代码 - 而不是尝试更改C代码逐行。或者,我只是在项目中包含纯C代码,并从Objective C调用所需的函数。
答案 2 :(得分:1)
什么阻止你在代码中使用c函数?您可以在Objective-c中使用任何c函数,它不会导致问题。 Cocoa中的许多函数都是c函数(例如NSSearchPathForDirectoriesInDomains()
。
答案 3 :(得分:1)
您的C版本是完全有效的Objective-C代码。你不需要翻译它。