一、面向对象和封装
1.面向对象的三大特性:封装(成员变量)、继承和多态
在OC语言中,使用@interface和@implementation来处理类。
2.封装:封装是对象和类概念的主要特性。它是隐藏内部实现,稳定外部接口,可以看作是“包装”。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
好处:使用更加简单 变量更加安全 可以隐藏内部实现细节 开发速度加快
@interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。
二、Set方法
1.作用:
1>为外界提供一个设置成员变量值的方法
2>对不合理的赋值进行过滤
2.命名规范:
3.set方法的声明1>方法名必须以set开头
2>Set后面跟上成员变量的名称,首字母大写
3>返回值一定是void
4>一定要接收一个参数,而且参数类型需要和成员变量的类型一致
5>形参名不能喝成员变量名一样(苹果官方推荐成员变量名前加_以示区分)
#import <Foundation/Foundation.h>
@interface Person : NSObject {
int _age;
}
// set方法的声明,接收一个int参数
// 方法名是 setAge: 后面的冒号:也是函数名的一部分
- (void)setAge:(int)age;
@end
4.set方法的实现
#import "Person.h"
@implementation Person
// set方法的实现
- (void)setAge:(int)age {
_age = age;
}
@end
三、Get方法
1.作用:为调用者返回对象内部的成员变量
2.命名规范:
1>必须有返回值,返回值的类型和成员变量的类型一致
2>方法名和成员变量名一样
3>不需要接收任何参数
3.get方法的声明
#import <Foundation/Foundation.h>
@interface Person : NSObject {
int _age;
}
- (void)setAge:(int)age;
// get方法的声明
- (int)age;
@end
4.get方法的实现
#import "Person.h"
@implementation Person
- (void)setAge:(int)age {
_age = age;
}
// get方法的实现
- (int)age {
return _age;
}
@end
注意:
1>在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。
2>成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:(1)与get方法的方法名区分开来;(2)可以喝一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。
四、类方法
1.定义:直接使用类名进行调用。
[Person new]; // Person类直接调用new方法
2.语法:类方法都是以+开头
+ (void)run; // 声明一个run的类方法
3.类方法和对象方法区别
注意点:对象方法可以和类方法重名。
4.对象方法和类方法的区别
对象方法:
1>减号-开头
2>只能由对象来调用(首先要通过类创建方法)
3>对象方法能访问当前对象的成员变量
4>需要传递参数
访问机制:首先通过对象指针访问对象,然后再通过对象内部的ISA指针访问类。(访问过程比较复杂)
类方法:
1>加号+开头
2>只能由类来调用
3>类方法不能访问成员变量
4>不需要传递参数
优点:不依赖于对象,执行效率高。
使用场合:当方法内部不需要使用成员变量时,就可以使用类方法
访问机制:直接访问类。
工具类:基本没有任何成员变量,而且其中的方法都是类方法。
五、Self关键字
1.概念:Self是一个指针,谁调用了当前方法,self就指向谁
出现在对象方法中,就代表着当前对象,出现在类方法中,就代表着当前类
2.Self的用途:
(1)可以利用self->成员变量名访问当前对象内部的成员变量(仅在对象方法中)
(2)[self 方法名];可以调用其他的对象方法或者是类方法
// 常见错误示例
@implementation Person
- (void)test
{
NSLog(@"调用了-test方法");
// 会引发死循环
//[self test];
}
+ (void)test
{
NSLog(@"调用了+test方法");
// 会引发死循环
//[self test];
}