封装
set方法和get方法、
@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数
代码示例
/*封装:成员变量的封装.
封装的好处:
过滤不合理的值
屏蔽内部的赋值过程.
让外界不必关注内部的细节.
*/
typedef enum
{
SexMan,
SexWoman
} Sex;
@interface Student : NSObject
{
//@public 以后尽量不要写成@public,这样是扣分的
int age;
//只允许修改不允许访问.只用set
//只允许外界访问no,不允许修改no 只需要提供get方法,也就是只读。
int no;
/*成员变量名的命名规范:一定要以下划线 _ 开头
作用:
1.将变量与方法名分开。
2.可以讲局部变量与成员变量分开。下划线开头的变量一般都是成员变量。
*/
Sex _sex;
}
- (void)study;
/*set方法
1,作用 :提供一个方法给外界设置成员变量值,并且可以在方法里对参数进行相应过滤
2 命名规范:
1>方法名必须以set开头
2>set后面跟上成员变量的名称,成员变量的首字母大写
3>返回值一定是void
4一定要接受一个参数,而且参数类型跟成员变量类型一致
5形参的名称不能跟成员变量名一样
*/
- (void)setAge:(int)newAge;
- (void)setSex:(Sex)sex;
- (Sex)sex;
/*
get 方法
1,作用:返回对象内部的成员变量
2命名规范
1>肯定有返回值,返回值类型肯定与成员变量一致
2>方法名跟成员变量名一样
3>不需要接受任何参数
*/
- (int)age;
@end
@implementation Student
- (void)study
{
NSLog(@"%d的学生在学习",age);
}
- (void)setAge:(int)newAge //成员变量的封装,保证数据的安全性
{
//对传进来的参数进行过滤
if (newAge <=0)
{
newAge=1;
}
age=newAge;
}
- (int)age
{
return age;
}
- (void)setSex:(Sex)sex;
{
//_sex = newSex;
_sex = sex;
}
- (Sex)sex;
{
//return sex;返回的不知道是成员变量还是方法
return _sex
}
@end
int main()
{
Student *stu = [Student new];
//stu->age = 22;/*这里随意改成员变量,不符合封装概念,不安全。将@public去掉,不要把成员变量暴露在外面给别人修改。*/
[stu setAge:10];//好处,传-10自动过滤[stu setAge:-10]
[stu setSex:SexMan];
[stu setNo:10];
[stu sex];
[stu no];
NSLog(@"学生的年龄是%d岁",[stu age]);
//[stu study];
return 0;
}
/*
4.设计一个成绩类
* C语言成绩(可读可写)
* OC成绩(可读可写)
* 总分(只读)
* 平均分(只读)
*/
#import <Foundation/Foundation.h>
@interface Score : NSObject
{
int _cScore;//c语言成绩
int _ocScore;//Oc成绩
//做法1,可以去除下面两个成员变量,返回两者,见下面set。get注释
//int _sumScore;//总分
//double _aveScore;//平均分
//做法2: 保留下面两者,见下函数
int _sumScore;//总分
double _aveScore;//平均分
}
- (void)setCScore;
- (int)cScore;
- (void)setOcScore;
- (int)ocScore
- (int)sumScore;
- (int)aveScorel;
@end
@implementation Score
- (void)setCScore
{
_cScore = cScore;
//计算总分平均分, 监听成员变量的改变
_sumScore = _cScore + _ocScore;
-aveScore = -sumScore/2;
}
- (int)cScore
{
return _cScore;
}
- (void)setOcScore
{
_ocScore = ocScore;
_sumScore = _cScore + _ocScore;
-aveScore = -sumScore/2;
}
- (int)ocScore
{
return _ocScore;
}
- (int)sumScore
{
//return _cScore+_ocScore;
return _sumScore;
}
- (double)aveScore
{
//return (_cScore+_ocScore)/2;
return _aveScore;
}
@end
int main()
{
Score *s =[Score new];
[s setCScore:10];
[s cScore];
[s setOcScore:20];
[s ocScore];
int a = [s sumScore];
int b = [s aveScore];
NSLog(@"总分%d",a);
return 0;
}
弱语法:
一.[p test],未曾声明过test对象方法,
1.编译cc –c的时候会出现一个警告:
May not respon to test
如同C语言未声明的函数一样。
2.如果cc .o -framework Foundation
一点错误都没有
而在C语言中为报错。说函数未声明。
3../a.out
报错(其实这里就是程序崩溃闪退),一旦运行过程中崩溃就是闪退
unrecognized selector sent to instance
不能识别 消息 发送的 对象
给person 对象发送了一条不能识别的消息:test
二,只有声明没有实现
报错
OC中方法调用是动态检测,在运行过程中才会检测对象有没有实现相应方法
三.只有实现没有声明(有个条件:必须写在main函数前面)
方法:没有任何错误,也没有警告,这样写也是对的
如果是类:@implementation Person : NSObject(在这里加上这个)不写类声明也是对的,但是开发中不会这么做,只是知道对就行了(仅仅有未声明的警告)
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com