——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
成员变量之前学习时一直在用的方法是这个样子的
@interface Student : NSObject
{
@public
int age;
}
@end
Student *stu = [Student new];//申请一个对象
stu->age = 20;
但是有缺陷!
缺点: 申明为 public 之后,只要知道成员名字,就可以通过指针任意改变其内容.这样是不安全的.
假想一下,假如你的程序被一个黑客干掉了.他通过这种赋值方法可以对你程序为所欲为…
为了避免此类郁闷的情况发生,我们应该追加一些保护措施.
即”封装”的思想.
首先,去掉 public 声明,让别人无法从外部肆无忌惮的修改成员变量
@interface Student : NSObject
{
int age;
}
@end
在我们需要修改成员变量时,可以声明一个 set 方法
/*
set 方法
1提供一个方法给外界设置 参数值
2.命名规范
1>方法名必须以 set 开头
2>set 后面跟上成员变量的名称,成员变量的字母必须大写
3>返回值一定是 void
4>一定要接收一个参数,参数类型跟成员变量一致
5>形参的名称不能跟成员变量名一模一样
*/
- (void)setAge:(int)newAge;
// 对输入的数据过滤,并修改成员变量
- (void)setAge:(int)newAge
{
if(newAge <= 0)
{
newAge = 1;
}
age = newAge;
}
这样一来,想要修改变量是,别人就必须按照我们规定的方法来.
我们的主动权就更强.
同样,举一反三.有 写 就有 读.
我们一样可以定义一个 get 方法
/*
get 方法
1.作用:返回对象内部的成员变量
2.命名规范:
1> 肯定有返回值,且返回值与成员变量类型一致
2> 方法名必须是以 get 开头? 在oc 中方法名和成员变量名一致
3> 不需要接收任何参数
*/
- (int)age;
- (int)age
{
return age;
}
当我们想提供只读或者只写的功能时.一样,我们只提供 读 或 写 的方法就 ok 了
封装的思想大致就是如此
再补充其他一些学习记录
成员变量命名规范:
一定要以下划线 _ 开头
typedef enum{
SexMan,
SexWoman,
} Sex;
@interface Student : NSObject
{/*
成员变量命名规范: 一定要以下划线 _ 开头
作用:
1.让成员变量和 get 方法的名称区分开
2.可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量
*/
int _no;
Sex _sex;
}
类方法
类方法都是以+开头
@interface Person : NSObject
+ (void)printClassName;
@end
@implementation Person
+ (void)printClassName
{
NSLog(@"这个类叫做 person ");
}
@end
int main()
{
[Person printClassName]; // 类方法调用
return 0;
}
对象方法
1> 减号 - 开头
2> 只能有对象调用
类方法
1> 加号 + 开头
2> 只能由类调用
描述
实例变量不能在类方法中访问
优点: 类方法效率高
使用场合: 当方法内部不需要使用到成员变量时,就可以改为类方法.可能在设计工具类的时候较为常用
self 用法
self 的用途:
1> 概念: 指向了当前对象(方法调用者)
2> 可以利用 “self-> 成员变量名”访问当前对象内部的成员变量
3> [self 方法名];
self 是一个指向当前对象的指针.
通过第1>条我们可以了解.在类方法中的 self 依旧调用类方法,对象方法中的 self 依旧调用对象方法.这两个不会串了.
- (void)test
{
//self : 指针 -> 指向当前对象
int _age = 20;
NSLog(@"Person's age is %d", self->_age);
// [self founction]
}
即便是我们声明了_age 这样一个奇怪的变量.
只要用了 self 一指 -> 我们都可以找到成员变量 _age 而不受影响
归根结底,这玩意的存在是为了方便大家而存在的.
可以多试试举一反三的用法,今天有点困,吃不消了,先睡觉了.