Run*_*oop 0 iphone cocoa-touch objective-c cross-compiling
我找到了我想在我的应用程序中使用的交流功能.不幸的是,我的知识并不是很好.第一部分代码显示原始c代码,第二部分代表我对目标c的"翻译".我有3个问题,我将非常感谢您的帮助:
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)
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];
Run Code Online (Sandbox Code Playgroud)
没有理由将int转换为NSIntegers.Apple已添加此类型以实现64位兼容性.NSInteger是typedef'd,因此在32位平台上它需要32位,在64位平台上需要64位.
我试着尽可能少地改变C代码.(当原始版本更新时,更容易更新它.)所以请保持原样.
C的内存管理比Objective-C更基本,但是你似乎知道你使用malloc和free,它只是保持不变.保留/释放和垃圾收集器仅对对象有用.
| 归档时间: |
|
| 查看次数: |
1073 次 |
| 最近记录: |