構造方法(init方法)和init方法的重寫
/*
1> 建立一個物件,那麼就呼叫這個類的new方法.
2> new方法是一個類方法,new方法做的事情:
1>在堆區開闢空間儲存物件,這個物件中會宣告它對應的類中定義的所有屬性(注意是屬性,沒有方法),還有一個isa指標,指向對應的在程式碼區中的類
2>初始化這個物件內部屬性的值
1,基本資料型別初始化為:0
2,OC的指標初始化為:nil 即:(0X0)不指向任何地址
3,如果是C指標初始化為:NULL (0X0)
3>返回這個物件在堆區的地址
3> new方法的底層
new方法的底層是呼叫了alloc方法和init方法.
alloc方法是一個類方法,這個方法做的事情是:建立物件.
init方法是一個物件方法,這個方法做的事情是:初始化這個物件.(初始化就是為物件的屬性賦預設值.)
4> 所以建立物件YYPerson *xiaoming = [YYPerson new];等價於YYPerson *xiaoming = [[YYPerson alloc]init];
因為new方法內部就是先呼叫類方法alloc,再呼叫物件方法init.
5> init方法,我們叫做構造方法.
init
6> 重寫init方法.
如果我們希望物件創建出來以後,物件的屬性的值不是預設值0/nil/NULL,而是我們期望的值,那麼我們就可以重寫init方法.
1, 先呼叫父類的init方法.
2, init方法有返回值,返回值是當前物件,呼叫init方法有可能會執行失敗,執行失敗返回值就是nil.呼叫父類的init方法,將這個方法的返回值賦值給self.
3, 判斷父類的init方法是否執行成功,如果成功,再去按照自己期望的方式初始化自己的屬性.
4, 返回當前物件,self.
7> 需要重寫init方法的情況.
1, 當物件創建出來的時候,希望物件的屬性的值是我們指定的值,而不是0/nil/NULL.
2, 如果有一段程式碼,希望在物件建立的同時執行,那麼我們就可以將這段程式碼寫在init方法中.
8> 重寫init方法的規範.
必須先呼叫父類的init方法,並複製給self,並判斷是否成功執行.
- (instancetype)init
{
if(self = [super init])//說明父類的init方法執行成功
{
初始化子類自己的屬性;
}
return self;
}
*/
#import <Foundation/Foundation.h>
//人類的宣告
@interface YYPerson : NSObject
@propertyNSString *name;
@propertyint age;
- (void)sayHi;
@end
//人類的實現
@implementation YYPerson
- (void)sayHi
{
NSLog(@"大家好,我叫%@,今年%d歲了!", _name, _age);
}
- (instancetype)init//重寫init方法
{
if(self = [super init])
{
self.name = @"小明";
self.age = 18;
}
return self;
}
@end
int main(int argc, const char * argv[]) {
//建立物件
YYPerson *xiaoming = [[YYPersonalloc]init];//此處呼叫了重寫之後的init方法,為物件的屬性賦值了期望的值.
//呼叫方法
[xiaoming sayHi];
return 0;
}