登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [ios]NSHomeDirectory() 在 ios 下是不可写入的,虽然 macos 沙盒环境下可以 - 及一个字符串转换错误     [回主站]     [分站链接]
[ios]NSHomeDirectory() 在 ios 下是不可写入的,虽然 macos 沙盒环境下可以 - 及一个字符串转换错误
fyfree
浏览(23) - 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 ,很显然,这是会出问题的 - 如果用前者的话

}//
//--------------------------------------------------------


}//






总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1