点语法与继承
一、点语法
1.点语法本质
点语法与setter和getter方法:
使用点语法,需要有对应的getter和setter方法
setter方法:无返回值,只有一个参数,方法名以set开头
getter方法:有返回值,没有参数
点语法出现在"=" 左边的时候,相当于调用setter方法
点语法出现在"=" 右边的时候,相当于调用getter方法
使用点语法时,如果表示设置值,"."后面的单词来自setter方法中set后面的单词,而且首单词的首字母小写;
如果表示获取值,"."后面的单词就是getter方法的方法名
2.property和synthesize
(1)
//NSInteger决定了setter方法的参数,决定了getter方法的返回值
//age决定决定了getter和setter方法的名称
@property NSInteger age;
//相当于声明下面两个方法
//- (void)setAge:(NSInteger)newAge;
//
//- (NSInteger)age;
//表示实现成员变量_age的getter和setter方法
@synthesize age = _age;//不是代表赋值
//相当于实现下面两个方法
//- (void)setAge:(NSInteger)newAge{
// _age = newAge;
//}
//
//- (NSInteger)age{
// return _age;
//}
(2)没有@synthesize
当只有@property而没有对应的@synthesize时,编译器自动增加@synthesize age = _age;_age是根据@property NSInteger age中的age自动生成的
(3)没有@synthesize和成员变量
当只有@property而没有对应的@synthesize和成员变量时,编译器自动增加@synthesize age = _age;并且,会自动生成一个私有的成员变量_age
3.属性修饰符
访问控制:
readwrite:可读可写,默认修饰符,本质上针对成员变量可读写
readonly:只读,相当于只有getter方法,没有setter方法
getter = method:设置getter方法的方法名
setter = method:设置setter方法的方法名,需要注意方法名中的":"
原子性:
atomic:原子的,默认的,需要考虑线程安全
nonatomic:非原子的,不考虑线程安全
内存管理:
assign:直接赋值,默认的,给成员变量直接赋值
2.代码中表现继承关系
(1)基本语法
@interface 子类名 : 父类名
Person是NSObject的子类,NSObject是Person的父类
OC里,NSObjec可以被称为根类
//Male继承自Person,那么Male类就拥有了Person类的成员变量和方法
_age = 12;//子类中可以直接调用父类的成员变量
[self sleep];//子类可以直接调用父类的成员方法
[rr sleep];//类外,可以直接调用父类的方法
(2)成员变量的访问控制
@interface Person : NSObject{
NSString *_name;//默认@protected
@public //公有的,类内-方法可以直接访问,如果子类继承父类,子类-方法可以直接访问;类外可以通过 “对象指针->成员变量” 方式访问
NSInteger _age;
@protected//受保护的,类内-方法可以直接访问,子类中-方法可以直接访问,类外不能直接访问,但是可以借助方法间接访问成员变量
NSInteger _height;
@private//私有的,类内-方法可以直接访问,子类中-方法不能直接访问,但是可以借助方法间接访问,类外不能直接访问,但是可以借助方法间接访问成员变量
NSInteger _weight;
NSInteger _money;//私房钱
}
(3)私有化方法
OC中没有私有方法
(1)在类的.m文件中实现方法,但是不在.h中声明该方法
(2)借助 匿名类别/扩展 实现,匿名类别的声明写在.m文件中@implementation上面,方法的实现写在@implementation里面
//声明匿名类别,括号中没有内容
//可以对某个类扩展方法
//表示需要扩展的是Dog类
@interface Dog (){
//匿名类别中可以声明私有的成员变量
NSInteger _age;
}
//声明方法
- (void)run;
@end
三、重写
子类重新实现父类的方法
//父类的方法不适合子类,子类重新实现父类的方法
//对父类的方法的功能进行扩充
五、其他
1.init方法
- (Son *)initWithHeight:(NSInteger)newHeight{
//super不总是调用init方法
//如果父类有初始化方法,就调用父类的初始化方法
if (self = [super initWithAge:12]) {
_height = newHeight;
}
return self;
}
2.类别的继承性
//子类可以直接调用对父类扩展的方法
3.类簇(Class Clusters)
//对于官方提供的类,如NSString、NSArray、NSDictionary、NSNumber等,是不能被继承的,因为这些类被称为类簇
//NSString等类作为父类,没有实现相关的方法,NSString有很多子类组成,NSString的子类实现相关方法,这种类被称为类簇