更新记录
时间 |
版本修改 |
2020年4月3日 |
初版 |
2020年4月17日 |
详细描述了实现"协议中的属性"的问题 |
新建iOS工程去掉storyBoard
一个小插曲
上述问题总结
- 协议中的属性(即property)其实只声明了setter方法和getter方法,并没有实例变量。(想一下通用编程模式中接口的概念,是指某个类型实现了某些接口,而接口本身是不含有数据的。【注:这里的接口实质上就是iOS中所说的“协议”】)
- 协议中的方法都是对外公开的
- 匿名分类(即类扩展)中的属性,都是不对外公开(即private的)。
- 所以将协议中的属性,在匿名分类中实现,是一件非常奇怪的事情。因为协议本身声明了这个属性是public的,而匿名分类中又声明该属性是private的。所以编译器会报错,不知道该怎么处理。
- 如果想躲过编译器的报错,可以在头文件中声明该属性为readonly, 在匿名分类中声明该属性为readwrite。
- 但是在子类中修改协议(或者基类)的属性的对外权限时,是有警告的:
Attribute ‘readonly‘ of property ‘window‘ restricts attribute ‘readwrite‘ of property inherited from ‘UIApplicationDelegate‘
- 或者在头文件中直接声明该属性(就相当于继承了协议的setter方法和getter方法),并且也声明了一个实例变量。
- 与上述同等的做法,就是加入
@synthesize
声明。
如果根视图没有铺满全屏
写在后面的话
- 我第二次新建XCode demo的时候,仍然遇到了很多个问题,幸好之前都在此记录下了之前遇到的问题及解决方法。
- 如果有读者的demo无法正常运行的话,建议参考上述提及的每一个参考链接,都照着做一遍,就可以进入Hello World了!
iOS的XCode项目中去掉storyboard