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]; }