1.set方法和get方法的使用场合
@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),
比如僵尸的生命值不能为负数。
取值方法和设值方法通常称为访问器(accessor)方法
2.set方法
1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
2) 命名规范:
方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
形参名称不要跟成员变量同名
3.get方法
1) 作用:返回对象内部的成员变量
2) 命名规范:get方法的名称一般就跟成员变量同名
4. 成员变量的命名规范
成员变量都以下划线 _开头
作用:
可以跟get方法的名称区分开
可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
5.代码示例
#import <Foundation/Foundation.h>
// 声明
@interface Car: NSObject
{
int _wheels; //轮子个数
}
/*set方法*/
- (void)setWheels:(int)wheels;
/*get方法*/
- (int)wheels;
@end
@implementation Car
//set方法的实现
- (void)setWheels:(int)wheels
{
// 对外面传进来的轮子数进行过滤
if (wheels<=0)
{
wheels = 1;
}
_wheels = wheels;
}
//get方法的实现
- (int)wheels
{
return _wheels;
}
@end
6.封装的好处
过滤不合理的值
屏蔽内部的赋值过程
让外界不必关注内部的细节
7.弱语法
尽管编译器的容错能力比较强,但是写代码必须规范
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
@implementation Person
@end
int main()
{
Person *p = [Person new];
[p test];
return 0;
}
a.以上代码,没有test方法的声明和实现,编译和链接都不会报错,能生成可执行文件。在编译时只会有一个警告:warning:'Person' may not respond to 'test' [p test];
但是,一旦运行程序就会出错,程序会闪退,报的错误(经典错误)如下:
-[Person test]: unrecognized selector sent to instance0x7fd2ea4097c0
给Person对象发送了一个不能识别的消息
b.如果以上代码,有test方法的声明,没有test方法的实现,编译和链接也不会报错,也能生成可执行文件,在编译是也有一个警告。
但是,一旦运行程序就会出错,程序会闪退,报经典错误
c.如果以上代码,没有test方法的声明,有test方法的实现,编译和链接也都不会报错,并且没有警告,并且可以运行。
总结:
OC是在运行过程中才会检测对象有没有实现相应方法