instancetype:
以前看很多代码万能返回值类型是id类型
但是id类型表示的返回值类型不会被解释
换句话说,我存储的对象类型如果用id,在controller接收的时候用NSString接收也是不会报错的,只有在编译过后崩溃了才会给提示。
but,现在apple给我们提供了一个新的关键词:instancetype
instancetype在类型表示上,跟id是一样的,可以表示任何对象类型
而且它只能用在返回值类型上,不能像id一样用在参数类型上
注意,它只能用在返回值类型上,用在模型的返回值上感觉还是不错的,因为它会检测instancetype的真实类型
xib和storyboard的对比
共同点:
1、都是用来描述软件界面的
2、都是用Interface Builder工具来编辑
3、他俩的实质都是转换成代码去创建控件,当然,像咱们这种新手知道原理和如何使用就行了,建议过段时间再自己用代码定义,现在直接用代码自定义View容易出错
不同点:
1、Xib是轻量级选手,用来描述局部的UI界面,类似于Android中用xml描述的item布局
2、Storyboard是重量级选手,用来描述整个软件的主布局,并且能展示多个界面之间的跳转关系
加载Xib文件的两种方式
1、首先,你在程序里能看到的资源,实际上都是在MainBundle里面,所以,你得首先创建一个NSBundle对象,然后去调loadNibName方法,输入字符串,这个说一个诀窍啊,两个凡是:凡是要Name的,直接给他名字就行了,凡是File的一律是全路径。
加载xib文件
1、NSBundle
NSArray* array = [[NSBundle mainBundle]loadNibNamed:@"Test" owner:nil options:nil];
//添加控件第几个添加的就取第几个
[self.view addSubview:array[0]];
这时候,我们进去看一下他的返回值,发现是数组,就说明我们在xib文件里创建的这些控件都是放在数组里面的,那么我们直接用NSArray接收,然后在按顺序取出来用就好了
2、UINib,一个UINib对象就代表一个xib文件
//这里说明一下,下面的bundle参数可以直接传nil,系统会默认为以下写法,但是千万不要傻逼到把要创建的mainBundle也穿了nil,例如上面那个方法就不行,不信你试试
UINib * nib = [UINib nibWithNibName:@"Test" bundle:[NSBundle mainBundle]];
NSArray* array = [nib instantiateWithOwner:nil options:nil];
[self.view addSubview:array[0]];