IOS筆記-封裝構造方法

前面咱們用OC的類建立對象的時候咱們用的是new方法。其實new方法是一個組合的方法,它是由兩個方法組合在一塊的,分別是alloc方法和init方法。其中alloc方法是類方法,它是用來給對象分配一個存儲空間的,init方法是對象方法,它是用來對對象進行初始化的,init方法也叫作構造方法。xcode

在OC中,咱們一般要重寫init方法以便在初始化的時候就給成員變量賦上一些值,因此咱們在建立對象的時候最好不要用new方法,由於這樣咱們就不能重寫構造方法了。那麼怎麼重寫init方法呢?重寫init方法的步驟:函數

一、調用父類的init方法。這是爲了先初始化父類中聲明的成員變量和其餘屬性。學習

二、判斷對象是否初始化成功,成功的話再對子類的成員變量進行初始化。spa

三、返回初始化的對象。.net

下面咱們建立一個Person類,類中定義了一個int類型的成員變量_age,下面咱們建立一個Person類的對象並對其初始化,使_age的值爲20。設計

 

[objc]  view plain copy
 
  1. #import <Foundation/Foundation.h>  
  2.   
  3. // Person類的聲明  
  4. @interface Person : NSObject  
  5. @property int age;  
  6. @end  
  7.   
  8. // Person類的實現  
  9. @implementation Person  
  10. // 重寫init方法  
  11. - (id)init  
  12. {  
  13.     // 判斷父類的初始化是否完成,完成的話對_age進行初始化  
  14.     if (self = [super init]) {  
  15.         _age = 20;  
  16.     }  
  17.       
  18.     // 返回初始化完成後的對象  
  19.     return self;  
  20. }  
  21. @end  
  22.   
  23. int main()  
  24. {  
  25.     // 建立一個Person類的對象  
  26.     Person *p = [[Person alloc] init];  
  27.     // 輸出_age的值  
  28.     NSLog(@"_age = %d", p.age);  
  29.       
  30.     return 0;  
  31. }  


上面是對Person類的p對象進行初始化並使_age的值在初始化完成後就是20。code

 

重寫init方法的注意點:先調用父類的init方法[super init],再對子類的成員變量初始化。對象

那麼咱們可不能夠不在類中給成員變量賦初值,而是在其餘地方賦值呢?blog

在其餘地方賦初值的話就要從新定義init方法,下面咱們學習在main函數中傳入成員變量的初值。繼承

 

[objc]  view plain copy
 
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface Person : NSObject  
  4. @property int age;  
  5.   
  6. // 從新設計構造方法須要先聲明  
  7. - (id)initWithAge:(int)age;  
  8. @end  
  9.   
  10. @implementation Person  
  11. // 從新設計的構造方法並初始化_age  
  12. - (id)initWithAge:(int)age  
  13. {  
  14.     if (self = [super init]) {  
  15.         _age = age;  
  16.     }  
  17.     return self;  
  18. }  
  19. @end  
  20.   
  21. int main()  
  22. {  
  23.     // 建立一個Person類的對象,調用從新設計的構造方法並傳入賦給_age的值  
  24.     Person *p = [[Person alloc] initWithAge:23];  
  25.     // 輸出_age的值  
  26.     NSLog(@"_age = %d", p.age);  
  27.       
  28.     return 0;  
  29. }  


上面代碼輸出結果是:

_age = 23

自定義構造方法的注意點是:

一、以「-」號開頭,也就是必須是對象方法。

二、返回值通常是id類型。

三、方法名通常以initWith開頭。

 

下面咱們學習子類繼承父類時怎麼設計構造方法。

 

[objc]  view plain copy
 
  1. #import <Foundation/Foundation.h>  
  2.   
  3. // Person類的聲明和實現  
  4. @interface Person : NSObject  
  5. @property int age;  
  6. // 設計的構造方法的聲明  
  7. - (id)initWithAge:(int)age;  
  8. @end  
  9. @implementation Person  
  10. // 設計的構造方法的實現  
  11. - (id)initWithAge:(int)age  
  12. {  
  13.     if (self = [super init]) {  
  14.         _age = age;  
  15.     }  
  16.     return self;  
  17. }  
  18. @end  
  19.   
  20. // Student類的聲明和實現  
  21. @interface Student : Person  
  22. @property double score;  
  23. // 設計的構造函數的聲明  
  24. - (id)initWithAge:(int)age andScore:(double)score;  
  25. @end  
  26. @implementation Student  
  27. // 設計的構造方法的實現  
  28. - (id)initWithAge:(int)age andScore:(double)score  
  29. {  
  30.     //調用了父類從新設計的構造方法  
  31.     if (self = [super initWithAge:age]) {  
  32.         _score = score;  
  33.     }  
  34.     return self;  
  35. }  
  36. @end  
  37.   
  38. int main()  
  39. {  
  40.     // 建立一個Student類的對象,調用從新設計的構造方法並傳入_age和_score的值。  
  41.     Student *s = [[Student alloc] initWithAge:18 andScore:92];  
  42.     // 輸出_age的值  
  43.     NSLog(@"_age = %d, _score = %.1f", s.age, s.score);  
  44.       
  45.     return 0;  
  46. }  


上面的代碼的重點是在子類的構造方法中調用了父類的構造方法。在設計構造方法中,若是子類須要對父類的成員變量進行初始化且父類中已經定義了對該成員變量初始化的init方法,咱們就要調用父類的構造方法。也就是說,父類的屬性交給父類來處理,子類的給子類來處理。

 

 

以上就是構造方法的簡單介紹。咱們來總結幾個重點:

一、若是須要在初始化的時候就給成員變量賦值,咱們就要重寫init方法,也就是構造方法。

二、重寫構造方法的時候必定要調用父類的構造方法。

三、設計構造方法的時候記得父類的屬性交給父類處理。

四、構造方法必須是對象方法。

相關文章
相關標籤/搜索