OC_02_可见度和方法

来源:互联网 发布:手机画衣柜软件 编辑:程序博客网 时间:2024/06/01 22:36

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内部操作的是实例变量

每一个实例变量都需要一对settergetter⽅方法。 


多参数方法:

- (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个二进制,最高位是符号位,27次方为127,char的范围为-127127,字符对应的asc码表的255个符号

面试中要求交换两个数,用的是异或. 不是定义容器和加减运算.有时候两个数做加运算可能会超出类型值的范围

异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
如:1010 (10) 与 1001(9) 异或后为 0011 (3) 
0011 与 1001 异或后为 1010 . 这样进行两个数的交换.










0 0
原创粉丝点击