这是我参与「第四届青训营-iOS客户端」笔记创作活动的第三天。本篇文章旨在介绍OC语言的特性。如有错误,欢迎指正。如有缺漏,欢迎补充。
1.OC语言特性
正确访问变量:公开setter/getter方法
为什么不可以直接使用->来直接访问其他变量呢?
如果多个地方都能够直接访问、存取其他对象的成员变量的话容易使这个值产生错乱。
setter方法
必须为对象方法。这个方法可以设置成员变量并成员变量赋值,也可以在方法里面对变量进行判断来过滤掉不合理的值。
通过以下的例子来分析:
引用:bujige.net/blog/iOS-Me…
从图中举例的第一张图的line 1来看,它的成员变量名为“_size"。但是line 2中的方法名为“setSize”。所以我们可以得出第一条setter方法中的命名规范:方法名必须以set开头,而且后面的成员变量名去掉下划线,首字母必须大写。
除此之外,通过例子中的setter方法的实现,我们可以知道其他三条命名规范:返回值类型为void、必须提供一个参数且参数类型必须与所对应的成员变量的类型一致、形参名称和成员变量去掉下划线相同。(引用:bujige.net/blog/iOS-Me… )
getter方法
必须为对象方法。此方法可以用来访问成员变量,为调用者返回对象内部的成员变量的值。
从图中列举的第一张图的line 3和第二张图的line 1来看,我们可以发现返回值的类型和成员变量的类型一致。并且,我们从第一张图的line 1来看,它的成员变量名为“_size",但是在line 2 中方法名为“size”。所以我们得出一个命名规范就是:方法名必须是成员变量去掉下划线。与setter方法不同的一点就是getter方法中一定没有参数,但是setter方法中必须提供一个参数。
@property属性
为了节省时间成本,@property可以帮我们自动生成setter和getter。
属性声明:@property(属性特性,类型)属性名称; 声明了这个属性后我们外部除了可以用原本的get/set方法来访问属性以外还可以用.符号直接访问这个属性。
属性特性(attribute):
引用:link.juejin.cn/?target=htt…
协议@protocol
协议的目的是希望多个不同的类之间都有共通的方法与变量(interface),一个类可以遵守多个协议。协议由@protocol开头,以@end结尾。
协议声明:@protocol+协议名+继承协议 在协议中@required说明协议要求实现,@optional是可选方法,可以不被实现。
类遵守协议(interface):在某个类的interface声明的父类后方<加上协议名称>(可以遵守多个协议,在尖括号里加上多个协议名称就可以。
类实现协议方法(implementation):
- 创建遵守协议的对象:任何遵守协议的对象都可以被指派。
协议的两种模式
委托模式(delegate):委托方(声明协议)-->代理方(遵守协议)遵守delegate协议的对象可以传递消息。
数据源模式(dataSource):代理方(遵守协议)-->委托方(声明协议)遵守dataSource协议的负责提供数据。
引用:www.jianshu.com/p/d7dc2e54c…
2.总结
本篇文章主要讲述了OC的语言特性(@property和@protocol)。@property可以帮助我们直接生成set/get方法,让外部既可以更加方便快捷的访问类中的成员变量,也避免了让代码发生错乱的风险。但是值得注意的一点是要分清楚变量和属性:属性相当于成员变量加上get和set方法。