版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.04.30 |
前言
iOS中的视图加载可以有两种方式,一种是通过xib加载,另外一种就是通过纯代码加载。它们各有优点和好处,xib比较直观简单,代码比较灵活但是看着很多很乱,上一家公司主要风格就是用纯代码,这一家用的就是xib用的比较多。这几篇我们就详细的介绍一个xib相关知识。感兴趣的可以看上面写的几篇。
1. xib相关(一) —— 基本知识(一)
2. xib相关(二) —— 文件冲突问题(一)
3. xib相关(三) —— xib右侧标签介绍(一)
4. xib相关(四) —— 连线问题(一)
5. xib相关(五) —— 利用layout进行约束之界面(一)
6. xib相关(六) —— 利用layout进行约束之说明和注意事项(二)
7. xib相关(七) —— Storyboard中的segue (一)
8. xib相关(八) —— Size Classes(一)
9. xib相关(九) —— 几个IB修饰符(一)
10. xib相关(十) —— xib的国际化(一)
11. xib相关(十一) —— xib的高冷用法之修改视图的圆角半径、边框宽度和颜色(一)
12. xib相关(十二) —— UIStackView之基本介绍(一)
13. xib相关(十三) —— UIStackView之枚举UIStackViewDistribution使用(二)
14. xib相关(十四) —— UIStackView之UIStackViewAlignment使用(三)
15. xib相关(十五) —— UIStackView之工程实践(四)
回顾
上一篇主要讲述了UIStackView的工程实践,这一篇主要讲述UINib。
Overview
UINib对象在内存中缓存nib文件的内容,准备进行解档和实例化。当您的应用程序需要实例化nib文件的内容时,它可以做到这一点,而无需首先从nib文件加载数据,从而提高性能。 UINib对象可以在内存不足的情况下自动释放此缓存的nib数据以释放内存给应用程序,并在下次应用程序实例化nib时重新加载该数据。只要需要反复实例化相同的nib数据,应用程序就应该使用UINib对象。例如,如果您的table view使用nib文件来实例化table view cell,则在UINib对象中缓存nib可以显着提高性能。
当您使用nib文件的内容创建UINib对象时,该对象会将对象图加载到引用的nib文件中,但尚未将其解压缩。为了解开所有的nib数据并因此真正实例化nib,应用程序会调用UINib对象上的instantiateWithOwner:options:
方法。在Resource Programming Guide详细的描述了UINib对象遵循以实例化该nib的对象图的步骤。
Topics
1. Creating a Nib Object
-
- 在指定的bundle文件中,返回一个实例化nib文件的UINib文件。
-
- 从内存中存储的nib数据创建一个UINib对象。
2. Instantiating a Nib
-
- instantiateWithOwner:options:
- 解档并实例化内存中的nib文件,创建一个具体的对象树并设置为顶部级别对象。
-
- 在iOS 2.x中,此键的值是一个字典,其中包含nib文件中使用的任何代理对象的运行时替换对象。 在这个字典中,键是与代理对象关联的名称,值是您的代码中应该使用的实际对象。
-
- 替换nib文件中的任何代理对象。 这个键的值是一个NSDictionary对象。 字典的键是nib文件中任何代理对象的名称,每个键的值是代替代理使用的实际对象。
API - UINib
Xib其实就是固化在bundle里面的文件,每次加载都需要从Xib进行唤醒。
UINib就是封装或包含Interface Builder nib文件的对象。
先看一下UINib的API
#import <Foundation/Foundation.h>
#import <UIKit/UIKitDefines.h>
NS_ASSUME_NONNULL_BEGIN
NS_CLASS_AVAILABLE_IOS(4_0) @interface UINib : NSObject
// If the bundle parameter is nil, the main bundle is used.
// Releases resources in response to memory pressure (e.g. memory warning), reloading from the bundle when necessary.
+ (UINib *)nibWithNibName:(NSString *)name bundle:(nullable NSBundle *)bundleOrNil;
// If the bundle parameter is nil, the main bundle is used.
+ (UINib *)nibWithData:(NSData *)data bundle:(nullable NSBundle *)bundleOrNil;
// Returns an array containing the top-level objects from the NIB.
// The owner and options parameters may both be nil.
// If the owner parameter is nil, connections to File's Owner are not permitted.
// Options are identical to the options specified with -[NSBundle loadNibNamed:owner:options:]
- (NSArray *)instantiateWithOwner:(nullable id)ownerOrNil options:(nullable NSDictionary *)optionsOrNil;
@end
NS_ASSUME_NONNULL_END
这里需要说明的是:
1. + (UINib *)nibWithNibName:(NSString *)name bundle:(nullable NSBundle *)bundleOrNil;
该方法的作用就是创建一个UINib对象。
如果bundle的参数是nil,那么就使用 main bundle,在内存压力(内存警告)紧张的时候会释放该资源,并根据需要从buudle加载数据。
2. + (UINib *)nibWithData:(NSData *)data bundle:(nullable NSBundle *)bundleOrNil;
该方法的作用就是创建一个UINib对象。
如果bundle的参数是nil,那么就使用 main bundle。
3. - (NSArray *)instantiateWithOwner:(nullable id)ownerOrNil options:(nullable NSDictionary *)optionsOrNil;
该方法的作用实例化UINib对象。
该方法返回一个从NIB中加载的包含顶部级别的对象数组,owner和options参数均可为nil,如果owner参数为nil,那么链接File's Owner就不被允许,Options与-[NSBundle loadNibNamed:owner:options:]
指定的options的参数是一样的。
后记
本篇主要讲述了UINib相关,感兴趣的给个赞或者关注~~~~