将c翻译为目标c

Run*_*oop 0 iphone cocoa-touch objective-c cross-compiling

我找到了我想在我的应用程序中使用的交流功能.不幸的是,我的知识并不是很好.第一部分代码显示原始c代码,第二部分代表我对目标c的"翻译".我有3个问题,我将非常感谢您的帮助:

  1. 我的变量从他们的c对应物到他们的目标对应物的翻译是否有效?(我没有编译器警告)
  2. 在最后使用free()是否可以接受,或者在目标c中以另一种方式使用free

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);
Run Code Online (Sandbox Code Playgroud)

客观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);
Run Code Online (Sandbox Code Playgroud)

Geo*_*lly 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];
Run Code Online (Sandbox Code Playgroud)

int到NSInteger

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

我试着尽可能少地改变C代码.(当原始版本更新时,更容易更新它.)所以请保持原样.

内存管理

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