在OC中init開頭的方法, 我們稱之為構造方法
構造方法的用途: 用于初始化一個對象, 讓某個對象一創建出來就擁有某些屬性和值
重寫init方法, 在init方法中初始化成員變量
注意: 重寫init方法必須按照蘋果規定的格式重寫, 如果不按照規定會引發一些未知的錯誤
1.必須先初始化父類, 再初始化子類
2.必須判斷父類是否初始化成功, 只有父類初始化成功才能繼續初始化子類
3.返回當前對象的地址
#import "Person.h"
@implementation Person
/*
第一種寫法:
- (instancetype)init
{
// 1.初始化父類
// 只要父類初始化成功 , 就會返回對應的地址, 如果初始化失敗, 就會返回nil
// nil == 0 == 假 == 沒有初始化成功
self = [super init];
// 2.判斷父類是否初始化成功
if (self != nil) {
// 3.初始化子類
// 設置屬性的值
_age = 6;
}
// 4.返回地址
return self;
}
*/
/*
第二種寫法:
- (instancetype)init
{
self = [super init]; // self == nil == 0
if (self) {
// 初始化子類
_age = 6;
}
return self;
}
*/
//第三種寫法:常用的寫法
- (instancetype)init
{
// self = [super init];
// 注意: 不要把 = 號寫為 ==
// 一定要將[super init]的返回值賦值給self
if (self = [super init]) {
// 初始化子類
_age = 6;
}
return self;
}
@end
例子:
Person.m
#import "Person.h"
@implementation Person
- (instancetype)init
{
if (self = [super init]) {
_age = 10;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i", _age];
}
@end
Studnet.m
#import "Studnet.h"
@implementation Studnet
- (instancetype)init
{
if (self = [super init]) {
//注意:這里不能直接訪問父類的_age屬性,因為被@property生成的成員變量是私有變量(和private不同的)只能在自己的那個類中可見和訪問,才其他類中不可見,更不能直接訪問了。所以這里想給_age賦值可以用self調用_age的setter方法。
// [self setAge:10];不過這里不用調用setter方法因為super就是父類,父類中已經初始化_age了
_no = 1;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i , no = %i", [self age], _no];
}
@end