NSBundle类

简介: NSBundle类

当创建一个应用时,系统存储了应用相关联的所有资源,例如图片、文件等,将这些内容放在应用包(application bundle)中。为了定位应用包中的资源,则需要使用NSBundle类。


1.向应用包中添加资源


在使用Xcode进行iOS开发时,可以在Finder中选中一些资源文件,然后拖动到Xcode的左边窗口中,即可完成资源的添加。当出现如图4-35所示对话框时,通常选择复制资源文件到项目中。


2466108-a9d54e5a2d3f90d6.webp.jpg


图4-35 添加资源

由于Command Line Tool是没有Bundle概念的,所以需要先创建一个Single ViewApplication,如图4-36所示。


2466108-990df8d9111cf17d.webp.jpg


图4-36 创建应用

然后向程序的目录中添加一个myfile.txt文件,添加成功后,该资源文件就会出现在工程目录中,如图4-37所示。


2466108-d1414cfeb8cb2e95.webp.jpg


图4-37 添加myfile.txt


2.从应用包中读取资源


当向程序的应用包中添加了一些资源文件后,在某些情况下,就需要从应用包中读取这些文件,例如,获取一张图片并显示在屏幕上,这就需要找到这张图片在程序包中的位置。NSBundle类提供了在程序包中查找资源的相关方法。使用mainBundle方法来实例化得到一个NSBundle类对象。


@property (class, readonly, strong) NSBundle *mainBundle;


可以使用pathForResource方法来获取某个资源的路径,返回一个NSString类型的对象。


- (nullable NSString *)pathForResource:(nullable NSString *)name ofType:(nullable NSString *)ext;


把下方的所有代码添加到ViewController.m文件的viewDidLoad方法中,可以实现从应用包中读取名称为my file,类型为txt的文件(请提前添加文件到应用包),并打印出文件中的内容。


NSString *filePath = [[NSBundle mainBundle]pathForResource:@"myfile" ofType:@"rtf"];
NSLog(@"%@",filePath);
//读取文件
NSString *fileString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",fileString);


运行结果如图4-38所示,可以看到资源文件的路径,同时能够打印出资源文件中存储的内容。


2466108-b92f4fb40adfaa07.webp.jpg

图4-38 运行结果


开发者经常用到类NSBundle的mainBundle,一个包含了nib文件、编译代码等资源的目录,这个目录下有一个infoDictionary,通过这个信息字典开发者可以获取有关当前应用的一些基本信息,像应用名称、应用版本等。


测试示例代码如下:


//获取当前设备的信息字典
NSDictionary *info_dic = [[NSBundle mainBundle]infoDictionary];
//本地化的信息字典
NSDictionary *localized_info_dic = [[NSBundle mainBundle]localizedInfoDictionary];
//应用名称
NSString *app_name = [info_dic objectForKey:@"CFBundleDisplayName"];
//应用版本
NSString *app_version = [info_dic objectForKey:@"CFBundleShortVersionString"];
//应用build版本
NSString *app_build_version = [info_dic objectForKey:@"CFBundleVersion"];


摘自《iOS开发:从零基础到精通》

目录
相关文章
|
6月前
|
C#
57.c#:directorylnfo类
57.c#:directorylnfo类
50 0
C++类的一些特殊知识
C++类的一些特殊知识
|
6天前
|
存储 SQL 数据库连接
ConnectionProxy类
ConnectionProxy类的主要作用是用于代理真实的Conection(数据库连接类)。之所以要额外构建一个代理类,是因为我们需要对连接进行连接超时检查,也就是健康检查功能,所以我们需要额外一个类型为long的属性来存储连接被取出时的时间。另一个重要的原因是,对于Connection中的一些接口我们并不希望显式的暴露给外部去使用。就比如说Connection中的close方法,就不能显式的暴露给外部使用,因为Connection在连接池中需要被重复使用,我们希望关闭连接的操作是有连接池来负责。在ConnectionProxy中,需要代理Connection中的一些必要的方法。这个可以看具
|
5月前
|
存储 安全 C#
C# 类的深入指南
C# 类的深入指南
|
6月前
|
传感器 存储 调度
PowerManagerService类大致解读
PowerManagerService类大致解读
101 1
|
6月前
|
Java 索引
JAVAStringBuilder类
JAVAStringBuilder类
32 0
|
6月前
|
Java
JAVAFile类
JAVAFile类
47 0
|
6月前
|
API C# vr&ar
59.c#:steamWriter类
59.c#:steamWriter类
49 0
|
6月前
|
存储 编译器 C++
c++类全面讲解
前言 这次主要讲类的基础、构造函数与析构函数的使用,以及继承和多态。
120 0
TimeUnit类详解
TimeUnit类详解
295 0
TimeUnit类详解