1. 继承
继承在OC中是单向的
OC中只允许单继承和C++不一样
子类可以重写父类的方法
声明子类的setter和getter方法时,只要实现自己的成员变量即可,不用写父类的,父类的已经封装完成了,你直接调用就可以啦
基础知识补充:
NSInteger 包括:int long short
创建一个对象,对象放在堆区 栈区存放变量
Person *per1 = [[Person alloc] init];
对象:[[Person alloc] init]
per1:是指针
[self 方法名];
// self出现在对象方法中,则指当前的对象,如果出现在类方法中,则指当前类
NSLog(@"self = %@", [self class]);
// 可以查看现在的对象所属的类是什么
// <strong>没有创建对象时,通过super关键字调用父类方法</strong>
#pragma mark---------------------self这部分比较绕,可以仔细理解一下--------------
// <strong>self:是谁调用的就是谁所属的类:</strong> 以下是例子
/* 声明一个Student和CollegeStudent类,CollegeStudent继承于Student类
在Student类中定义了一个sleep方法:
<pre name="code" class="objc"> CollegeStudent中没有重写sleep方法,只是单纯的继承
*/
- (void)sleep{
NSLog(@"SLEEPING......");
NSLog(@"self = %@", [self class]);
}
/* CollegeStudent *p = [CollegeStudent new];
[p sleep];
在sleep中的self的值:
*/
NSLog(@"self = %@", [self class]); // ----------->中的self打印之后的结果:CollegeStudent
// <strong>因为是p调用的sleep,所以返回的是p的所属类,不是sleep所在的类Student</strong>
2. 初始化
1. 之前使用的初始化方法:
- (id)init{
_name = @"李莫愁";
_sex = @"女";
return self;
}
// 也有这样写的初始化方法:
- (id)init{
self = [super init];
_name = @"黄蓉";
return self;
}
- (id)init{
self = [super init]; // 调用父类的初始化方法,将继承下来的变量进行初始化
if (self != nil) {
// 初始化方法
_name = @"小龙女";
_sex = @"女";
}
return self;
}
2. 完整的初始化方法:
3. self:如同指针
在动态方法中(-方法/对象方法):self代表对象
在静态方法中(+方法/类方法):self代表类
[super init]:发送消息,要调用父类初始化方法,然后返回给子类
- (id)initWithName:(NSString *)name
Sex:(NSString *)sex
Age:(NSInteger)age{
self = [super init];
if (self) {
_name = name;
_sex = sex;
_age = age;
// 下面两个NSLog打印出来的 只是测试一下
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%s",__FUNCTION__);
}
return self;
}
打印的结果:
Person
-[Person initWithName:Sex:Age:]
id和instancetype用起来一样
3. 便利构造器:
+ (Person *)personWithName:(NSString *)name
Age:(NSInteger)age
Sex:(NSString *)sex{
// 便利构造器内部创建对象
// 便利构造器已经创建了对象,直接调用就可以了,不用再创建新的啦
Person *p = [[[Person alloc] initWithName:name Sex:sex Age:age] autorelease];
return p;
}
// main函数中调用时:不用alloc或new创建
Person *p = [Person personWithName:@"夏目" Age:16 Sex:@"男"];
析构函数:
- (void)dealloc{ [super dealloc]; }