OC_02_VisibilityAndMethods
可见度
@public,@protected,@private
@public(公有的): 实例变量(该类的对象)可以在类的内部和外部操作.
@protected(受保护的,默认的): 实例变量(该类的对象)只能在该类和其子类内操作.
@private(私有的): 实例变量(该类的对象)只能在该类内访问.
为什么不使⽤@public?
1、使⽤@public关键字,暴露了类内部的细节。
2、不符合面向对象语言的三大特性之一—封装 。
类的内部从@implementation开始,到@end结束,在内部可以使用任意可见度的成员变量。
OC中的⽅法分两种:类方法和实例⽅法。
类方法:只能类使用,例如:+(id)alloc注:类方法中不能使用实例变量
实例方法:只能对象使用,例如: -(void)sayHi
类的方法
- (void)setStuName:(NSString *)stuName;
-为方法类型标示符,void为返回值类型,setStuName为参数形容词,NNString *为参数类型,stuName为参数名
删除:类型标识,返回类型,参数类型,参数名,空格。
所以方法的方法名为setStuName:,必须有冒号.
类中不能出现同名⽅方法。
“ : ” 标识参数,不能省略。有冒号必须有参数。
- (void)printStr:(NSString *)str;
- (void)printStr:(NSInteger)arr;
以上两个方法名相同,不能被重复定义且方法名是printStr:
- (void)printStr:(NSString *)str printNum:(NSInteger)num;(两个参数中间以空格隔开)
该方法名为:printStr: printNum:
方法名会在方法调用的时候会使用;
形参的名会在声明和方法的实现的时候会用;
只要一个参数,就要有一个冒号与之相对应,冒号不能省略;
在OC中使⽤用消息发送机制:[receiver message]
我们现在在主函数进行方法的调用
例如:
Student *stu = [[Studentalloc]init];
[stusayHi];
对类中的成员变量进行赋值:
在OC⾥里,为实例变量赋值的⽅方法称作setter(设置器)。读取实例变量值的⽅方法称作getter(访问器)。
成员变量可见度变成被保护之后,无法外部进行赋值,取值操作,所以只能通过方法来实现赋值和取值操作,对应setter(设置器)和getter(访问器)方法。
每一个成员变量都有对应一个设置器和一个访问器,他们成对出现。
只有对一个成员变量赋值的方法,我们管他叫设置器,对多个成员变量赋值,称为赋值语句。
setter方法命名规范,set+去掉下划线的成员变量名。
对成员变量进行取值 getter方法。
getter方法的命名规范,不用加get,直接用去掉下划线的成员变量名。
.h: - (void)setStuName:(NSString *)stuName;----(setter)
- (NSString *)stuName;----(getter)
.m:
- (void)setStuName:(NSString *)stuName
{
_stuName = stuName;
}
- (NSString *)stuName
{
return_stuName;
}
无论setter还是getter内部操作的是实例变量
每一个实例变量都需要一对setter和getter⽅方法。
多参数方法:
- (void)setStuName:(NSString *)stuName stuSex:(NSString *)stuSex;
自定义初始化方法
-(id)init 这个初始化方法只能给实例变量设置默认值,不灵活。
-(id)initWithName:⾃定义初始化方法,根据需求定义初始化方法。
自定义初始化方法一定要 -init开头,后面接With,with之后可以把要初始化的部分接在后面。
例:
.h
- (id)initWithStuName:(NSString *)stuName
stuAge:(NSInteger)stuAge
stuSex:(NSString *)stuSex
stuHobby:(NSString *)stuHobby
stuScore:(CGFloat )stuScore;
.m
- (id)initWithStuName:(NSString *)stuName
stuAge:(NSInteger)stuAge
stuSex:(NSString *)stuSex
stuHobby:(NSString *)stuHobby
stuScore:(CGFloat )stuScore
{
_stuName = stuName;
_stuAge = stuAge;
_stuSex = stuSex;
_stuHobby = stuHobby;
_stuScore = stuScore;
return self;
}
[stu setStuName:@"queen"stuSex:@"女"stuAge:22stuScore:100.0stuHobby:@"购物"];
导⼊入头⽂文件,即:导⼊入头⽂文件中的内容到当前类。
#import “”导⼊入⾃自定义类,#import <>导⼊入类库中的头⽂文件。
功能类似C语⾔言中的#include,但是可以避免头⽂文件被重复导⼊入。
容易出现循环导⼊入头⽂文件问题。
@class
告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容。有效避免嵌套循环导入。
实例变量有3种常⻅见的可⻅见度:@public、@protected、@private。
@public违背了封装特性,⾯面向对象开发中很少使⽤用;@protected默认可⻅见度,⾃自⼰己和⼦子类中能使⽤用—>访问实例变量;@private⾃自⼰己类中能使⽤用—>访问实例变量。
⽅方法是OC的核⼼心,采⽤用消息机制:[receiver message]。“-”message由对象来调⽤用;“+”message由类来调⽤用。
PS:有时候.h和.m会出现声明的和实现的不匹配,注意书写的错误
枚举:
typedefNS_ENUM(NSInteger, NSKing) {
king = 1 << 0,
queen = 1 << 1,
joker = 1 << 2
};
枚举是整形,char,long,short,BOOL都可以,CGFloat不行
char可以看成类型更小的整形,如asc码表,一个字节是8个二进制,最高位是符号位,2的7次方为127,char的范围为-127到127,字符对应的asc码表的255个符号。
面试中要求交换两个数,用的是异或. 不是定义容器和加减运算.有时候两个数做加运算可能会超出类型值的范围