前面咱們用OC的類建立對象的時候咱們用的是new方法。其實new方法是一個組合的方法,它是由兩個方法組合在一塊的,分別是alloc方法和init方法。其中alloc方法是類方法,它是用來給對象分配一個存儲空間的,init方法是對象方法,它是用來對對象進行初始化的,init方法也叫作構造方法。xcode
在OC中,咱們一般要重寫init方法以便在初始化的時候就給成員變量賦上一些值,因此咱們在建立對象的時候最好不要用new方法,由於這樣咱們就不能重寫構造方法了。那麼怎麼重寫init方法呢?重寫init方法的步驟:函數
一、調用父類的init方法。這是爲了先初始化父類中聲明的成員變量和其餘屬性。學習
二、判斷對象是否初始化成功,成功的話再對子類的成員變量進行初始化。spa
三、返回初始化的對象。.net
下面咱們建立一個Person類,類中定義了一個int類型的成員變量_age,下面咱們建立一個Person類的對象並對其初始化,使_age的值爲20。設計
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age;
- @end
-
- @implementation Person
- - (id)init
- {
-
- if (self = [super init]) {
- _age = 20;
- }
-
-
- return self;
- }
- @end
-
- int main()
- {
-
- Person *p = [[Person alloc] init];
-
- NSLog(@"_age = %d", p.age);
-
- return 0;
- }
上面是對Person類的p對象進行初始化並使_age的值在初始化完成後就是20。code
重寫init方法的注意點:先調用父類的init方法[super init],再對子類的成員變量初始化。對象
那麼咱們可不能夠不在類中給成員變量賦初值,而是在其餘地方賦值呢?blog
在其餘地方賦初值的話就要從新定義init方法,下面咱們學習在main函數中傳入成員變量的初值。繼承
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age;
-
- - (id)initWithAge:(int)age;
- @end
-
- @implementation Person
- - (id)initWithAge:(int)age
- {
- if (self = [super init]) {
- _age = age;
- }
- return self;
- }
- @end
-
- int main()
- {
-
- Person *p = [[Person alloc] initWithAge:23];
-
- NSLog(@"_age = %d", p.age);
-
- return 0;
- }
上面代碼輸出結果是:
_age = 23
自定義構造方法的注意點是:
一、以「-」號開頭,也就是必須是對象方法。
二、返回值通常是id類型。
三、方法名通常以initWith開頭。
下面咱們學習子類繼承父類時怎麼設計構造方法。
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age;
- - (id)initWithAge:(int)age;
- @end
- @implementation Person
- - (id)initWithAge:(int)age
- {
- if (self = [super init]) {
- _age = age;
- }
- return self;
- }
- @end
-
- @interface Student : Person
- @property double score;
- - (id)initWithAge:(int)age andScore:(double)score;
- @end
- @implementation Student
- - (id)initWithAge:(int)age andScore:(double)score
- {
-
- if (self = [super initWithAge:age]) {
- _score = score;
- }
- return self;
- }
- @end
-
- int main()
- {
-
- Student *s = [[Student alloc] initWithAge:18 andScore:92];
-
- NSLog(@"_age = %d, _score = %.1f", s.age, s.score);
-
- return 0;
- }
上面的代碼的重點是在子類的構造方法中調用了父類的構造方法。在設計構造方法中,若是子類須要對父類的成員變量進行初始化且父類中已經定義了對該成員變量初始化的init方法,咱們就要調用父類的構造方法。也就是說,父類的屬性交給父類來處理,子類的給子類來處理。
以上就是構造方法的簡單介紹。咱們來總結幾個重點:
一、若是須要在初始化的時候就給成員變量賦值,咱們就要重寫init方法,也就是構造方法。
二、重寫構造方法的時候必定要調用父類的構造方法。
三、設計構造方法的時候記得父類的屬性交給父類處理。
四、構造方法必須是對象方法。