Objective-C获取mainBundle资源返回null无法读取文件求助
问题根因
核心判断依据是[[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"txt"]返回null——这说明目标文件根本没有被打包进最终的.app产物,和你怎么拼接路径、Finder里项目目录怎么放没有直接关系,拼路径的代码写得再对也读不到不存在的文件。
修复步骤
按以下顺序排查即可解决问题:
- 检查Target Membership配置
选中项目里的myFile.txt,打开Xcode右侧的File Inspector面板,找到Target Membership板块,确认当前运行的MyApp_Demotarget前面的勾选框是选中状态。没勾选的文件不会进入打包流程,app包里自然找不到。 - 检查Copy Bundle Resources构建阶段
点击项目导航栏最顶部的项目文件,选中MyApp_Demotarget,切换到Build Phases标签,展开Copy Bundle Resources列表:- 如果
myFile.txt不在列表里,点列表底部的+号,选中文件添加即可 - 如果你要保留
Ressources目录结构打包,添加文件夹的时候一定要选Create folder references(不要选Create groups),这种情况下读取文件需要指定目录参数:NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"txt" inDirectory:@"Ressources"];
- 如果
- 修正原有代码的错误
你贴的代码里存在变量传参错误:定义的路径变量叫filePath,最后调用fileHandleForReadingAtPath:的时候传的却是resourcePath,参数传错肯定读不到文件。不要手动拼接resourcePath,苹果官方推荐直接用pathForResource:ofType:系列API获取路径,避免拼接错误,参考正确实现:NSError *readError = nil; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"txt"]; NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:[NSURL fileURLWithPath:filePath] error:&readError]; if (readError) { NSLog(@"文件读取失败,错误信息: %@", readError); } - 清理缓存重新构建
配置改完后按Shift+Command+K清理Xcode构建缓存,同时删掉模拟器里已经安装的旧版App,再重新运行,避免旧安装包缓存导致配置不生效。
补充说明
Xcode里的虚拟分组(黄色文件夹图标)和Finder里的实际文件存储位置,都不影响最终打包结果。判断资源有没有进app包的唯一标准,就是pathForResource:方法能不能返回非空路径,拿不到路径就一定是构建配置的问题,不用在路径拼接逻辑上浪费时间。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

