Objective-C最基礎文法之Class定義

來源:互聯網
上載者:User

Objective-C最基礎文法之Class定義是本文要介紹的內容,Objective-C是物件導向的語言,因此的定義是基礎中的基礎。Objective-C是C的超級,但是在文法上跟C又有一些不同,尤其是在對屬性和方法的訪問上,有其非常特殊的文法。看過Objective-C的代碼都知道,裡面會有很多的中括弧,這是Objective-C專屬的。

Objective-C裡面一個的構成一般由兩部分組成,一個是成員和方法聲明的標頭檔(.h),一個是方法實現的檔案(.m)檔案。當然你也可以把的聲明寫在.m檔案裡面,但是這樣就是私人的成員,其他就不能使用了。成員的聲明是通過interface來實現的,懂C#的朋友應該知道C#裡面也有interface,但是Objective-C裡面的interfacegen跟C#裡面是完全是兩回事,Objective-C裡面的interface就是用來定義一個裡面有那些屬性和方法的。

一個類的方法有兩種,一種是類方法,一種是執行個體方法。類方法有點像靜態方法,它屬於一個類,而不是屬於一個類的執行個體。而執行個體方法就是屬於一個類的執行個體的方法。類方法在定義的時候前面用“+”號標識,執行個體方法前面則用“-”號標識。比如:

 
  1. + (id)allObjective-C;//這是一個類方法  
  2.  (void)doSomething;//這是一個執行個體方法  

在調用的時候使用中括弧的文法,比如:

 
  1. MyClass *class = [MyClass allObjective-C];//調用類方法,分配記憶體  
  2. [class doSomething];//調用執行個體方法,實現某些功能  

首先看一個完整的類的定義和實現的例子。
 
.h檔案的代碼為:

 
  1.  @interface Person:NSObject{  
  2. NSUInteger age;  
  3. NSString *name;  
  4. }  
  5. @property (nonatomic, assign)NSUInteger age;  
  6. @property (nonatomic,retain)NSString *name;  
  7.  
  8. + (Person *)person;  
  9. - (id)init;  
  10. - (void)setAge:(NSUInteger)theAge;  
  11. - (NSUInteger)age;  
  12.  
  13. - (void)vote;  
  14. @end  

.m檔案的代碼:

 
  1.  #import "Person.h"  
  2. @interface Person ()  
  3. - (BOOL)canVote;  
  4. @end  
  5. @implementation Person  
  6. @synthesize name;  
  7. - (void)setAge:(NSUInteger)theAge{  
  8. age = theAge;  
  9. }  
  10. - (NSUInteger)age{  
  11. return age;  
  12. }  
  13. - (id)init{  
  14. if (self = [super init]){  
  15. age = 0;  
  16. name = @"";  
  17. }  
  18. return self;  
  19. }  
  20. - (BOOL)canVote{  
  21. return age >= 18;  
  22. }  
  23. - (void)vote{  
  24. //do something  
  25. }  
  26. @end  

上面是一個比較完整的定義類的例子,首先在標頭檔裡面定義了兩個欄位,叫age和name;還有兩個屬性,也叫age和name,還有一個初始化的方法和一個執行個體方法。很多朋友剛接觸Objective-C的時候可能不理解,怎麼欄位和屬性的名字是一樣的?有什麼不同嗎?是的,在Objective-C裡面欄位和屬性的名字是可以一樣的,但二者是不同的東西。一般來說一個類的標頭檔聲明的結構是這樣的:

 
  1.  @interface 類名{  
  2. 欄位聲明  
  3. }  
  4. 屬性聲明  
  5. 方法聲明  
  6. @end  

欄位是私人的,在類外部不能使用。必須使用屬性,外部才能使用。什麼是屬性?其實屬性就是對一個欄位的get和set方法。在C#裡面我們可以很方便地使用get和set訪問器,但是在Objective-C裡面要分別定義。比如上面的例子就是定義了一個setAge的set方法和一個叫age的get方法 。
 
 而如果我們並不需要在屬性的get或者set方法中做任何的操作,還要自己寫這麼多代碼實在是有些麻煩。Objective-C裡有一種快速定義屬性的方法,就是使用 synthesize。synthesize後面跟著屬性名稱,編譯器就會自動幫你添加一個屬性,而不用自己去寫get和set方法了。那如果你要定義的屬性是唯讀或者有其他特性,該怎麼辦呢?看標頭檔裡面定義屬性的時候,只要做一些說明就好了。
 
 比如上面例子中的name屬性,在前面就有(nonatomic,retain)相關的說明。這些說明是跟記憶體管理和存取權限有關的,比如添加了retain說明,就類似於name = [value retail],也就是說在給這個屬性賦值的時候就會把retain count增加一。還有其他的說明比如readonly等,不一一列舉。一般來說,給基本類型比如NSInteger的屬性添加的說明有nonatomic, assign,而給參考型別的屬性添加唉的有nonatomic,retain。

除了定義欄位和屬性外,我們還需要定義方法。定義方法比較簡單,只要區分好類方法和執行個體方法就好了。還有一點需要注意的是,在Objective-C中一個方法的名稱是包含冒號的,比如age屬性的set方法的完整的名稱是setAge:,而不是setAge。Objective-C裡方法的定義比較詭異,它允許將一個方法的名稱和參數的名稱混合在一起。比如在C#中我定義一個方法:     

 
  1. void SetPosition(int x,int y)  
  2. {}   
  3.    在Objective-C中就會變成這樣:  
  4.  - (void)setPositionX:(NSInteger) x Y:(NSInteger)y{  
  5. }  

這個時候完整的方法名是“setPositionX:Y:”,方法名和參數名是混合在一起的,各參數之間用空格分開,參數名後面緊跟著冒號,並用小括弧擴起參數的類型(別忘了參考型別要添加*以表示指標),最後跟著形參的名字。

還有一點要注意的是,形參的名字不要和屬性或欄位的名字重複了,否則會有編譯警告,說局部變數覆蓋了全域的變數。剛接觸Objective-C的時候對這個可能會比較不習慣,不過到後來感覺還蠻舒服的。
  
.m檔案裡面的代碼是方法的具體實現,這是對外不可見的。一個典型的m檔案的內容為:
  
#import "標頭檔.h"//系統內建的請用<>而不是雙引號,不解釋

 
  1. @implementation 類名{  
  2. //方法的具體實現  
  3. }  

方法的實現就不需要過多的解釋了。在上面的例子當中還額外多了一些東西

 
  1. @interface Person ()   
  2.      - (BOOL)canVote;   
  3. @end  

這又是幹什麼的了?在Objective-C中這叫“擴充”。所謂的擴充,其實就是對一個類的方法或屬性進行擴充。原來的類中沒有的方法或屬性,我們可以很方便得進行擴充。但是一定要注意,在擴充中只能擴充屬性和方法,如果你想添加欄位,那就會編譯錯誤。一個典型的擴充的寫法跟interface比較類戲,形如:

 
  1. @interfae 類名(可以添加一些說明性的文字,也可以留空)  
  2. //定義屬性和方法,但是不能添加欄位,因此那一對大括弧不能有  
  3. @end  

擴充可以是公開的,也可以是私人的,就看你在哪裡定義。這裡我定義在m檔案裡面,自然就是私人的了,如果定義在標頭檔裡面,那麼就是公有的。

interface可以分開多出定義,同樣的implementation一個類也可以寫多次,寫多次的好處就是調理比較清晰,提高代碼的可讀性。比如可以把功能相關的一些代碼寫在一個

 
  1. @ implementation@end中 

然後另外一些代碼寫在別的地方。

Objective-C中定義一個類的最基礎的文法大概就是這麼多。

小結:Objective-C最基礎文法之Class定義的內容介紹完了,希望通過本文的學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.