将c翻译为目标c

时间:2010-02-23 08:55:34

标签: iphone objective-c cocoa-touch cross-compiling

我找到了一个我希望在我的应用中使用的c函数。不幸的是,我的知识并不是很好。第一部分代码显示原始c代码,第二部分代表我对目标c的“翻译”。我有3个问题,我将非常感谢您的帮助:

  1. 我从他们的c对应物到他们的目标对应物的变量的翻译是否有效? (我没有编译器警告)
  2. 在最后使用free()是否可以接受,或者在目标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);
    

4 个答案:

答案 0 :(得分:6)

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

NSString to 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

没有理由将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代码。你不需要翻译它。