您的位置:
首页
>>
SoftHub关联区
>> 主题: [ios]NSHomeDirectory() 在 ios 下是不可写入的,虽然 macos 沙盒环境下可以 - 及一个字符串转换错误
[最新]
[回主站]
[ios]NSHomeDirectory() 在 ios 下是不可写入的,虽然 macos 沙盒环境下可以 - 及一个字符串转换错误
fyfree
浏览(112) -
2024-03-16 21:20:05 发表
编辑
关键字:
[ios]NSHomeDirectory() 在 ios 下是不可写入的,虽然 macos 沙盒环境下可以 - 及一个字符串转换错误
好多年前我就碰到过了,只是这次开发了新的 ui 库,然后又老在 macos 下做。特别是沙盒下能过就没多想。
不过模拟器居然也是可以过的。这个我是真没印象了。
看来发布之前还是要 TestFlight 一下。
char * GetMacosSandboxDataPath(void)
{
//应该要写入 Document 目录中才对
NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
char * r = NSString2cstr_2024(path2);
return r;
另外发现之前用的一个字符串转换成 c 接口的函数也是错误的! 如果原字符串有中文的话会留下崩溃隐患,比较牛的是,这在 macos 也是不会报错的。即使是 ios 超体同上也只是偶尔崩溃!
这是 c/c++/objectc 系的老问题了。
这两个问题都挺严重的,都难查,特别是第二个。
//NSString 转 char * 似乎有多种方法 //给 golang 调用的话还是要注意,一是要 free 的,二是要看 utf8 还是 asci
//长度不一定一样,三是不应该返回 const char * 而应该是 char *
char * NSString2cstr_2024(NSString *s)
{
if (NULL == s) s = @""; //尽量避免 NULL 陷阱
char * cStr = strdup([s cStringUsingEncoding:NSUTF8StringEncoding]);
return cStr; //strdup 的结果是要 C.free 的
//还不清楚 [s UTF8String] 的结果是否会自动释放。因为 cStringUsingEncoding 的肯定是会自动释放的,所以还是用 cStringUsingEncoding 先吧。
//return r;
//----
if (false){
const char * txt1 = [s UTF8String];
const char * txt2 = [s cString];
//百度则是
NSString *str = @"Hello, World!";
char *cStr = strdup([str cStringUsingEncoding:NSUTF8StringEncoding]);
// 使用完毕后释放内存
free(cStr);
}//
//如果你需要将NSString转换为C字符串(即C风格的字符串,以空字符null结尾的字符数组),可以使用cStringUsingEncoding:方法,并确保处理好内存管理,例如使用autorelease或手动管理内存。
//注意,strdup函数是在中定义的,它在堆上分配一个新的字符串副本,并返回这个副本的指针。使用完成后,你应该使用free函数来释放分配的内存。
//--------
//从注释来看, cStringUsingEncoding 等的结果确实是会自动释放的,不能直接返回,要复制一份再说。
//特别注意看 GetMacosSandboxDataPath 处的注释和下面的代码。不同方法得到的字符串长度是不同的! 用短了的话很容易崩溃!
//目前来说一定要统一使用 utf8 来转换!
//--
//字符串内存异常测试
if (false){
NSString * json_str = @"中文123";
const char * json_str_c = [json_str cString];
size_t len = strlen(json_str_c);
NSLog(@"%zu", len); //这个结果是 7
const char * txt1 = [json_str UTF8String];
size_t len2 = strlen(txt1);
NSLog(@"%zu", len2); //这个结果是 9
char *cStr = strdup([json_str cStringUsingEncoding:NSUTF8StringEncoding]);
size_t len3 = strlen(cStr);
NSLog(@"%zu", len3);
//一个是 7 一个是 9 ,很显然,这是会出问题的 - 如果用前者的话
}//
//--------------------------------------------------------
}//
本帖子属于以下条目()
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.