黑馬程式員---Objective-C基礎學習---類、對象、方法相關知識筆記

來源:互聯網
上載者:User

標籤:

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

類、對象、方法相關知識筆記

  Objective-C相對於C語言有了物件導向的特性,但是ObjC又沒有其他物件導向語言那麼多文法特性,ObjC本身對物件導向進行了精簡。下面是一些相關知識筆記。

  1. 類定義
  2. 成員變數
  3. 方法和屬性
  4. self關鍵字
類定義

  在C#、Java等其他進階語言中定義一個類是相當簡單點的,直接一個關鍵字class加一對大括弧基本就完成了,但是在ObjC中類的定義相對變化比較大。現在假設需要定義一個Person類

在Xcode中添加檔案,選擇Cocoa Class 或者Cocoa Touch Class

輸入類名Person,並選擇父類為NSObject

預設產生如下兩個檔案

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject@end

Person.m

#import "Person.h"@implementation Person@end

在ObjC中定義一個類需要兩個檔案.h和.m:

  • .h檔案:放類的聲明,包括成員變數、屬性和方法聲明(事實上.h檔案不參與編譯過程);關鍵字@interface聲明一個類,同時它必須以@end結束,在這兩個關鍵字中間聲明相關成員;在聲明Person類的同時可以看到它繼承於NSObject,這是ObjC的基類,所有的類最終都繼承於這個類(但是需要注意ObjC中的基類或者根類並不只有一個,例如NSProxy也是ObjC的基類),由於這個類在Foundation架構中定義,所以匯入了<Foundation/Foundaton.h>(這麼描述的意思是匯入Foundation架構中的Foundation.h聲明檔案);
  • .m檔案:放屬性、方法的具體實現;關鍵字@implementation用於實現某個類,同時必須以@end結尾,在這兩個關鍵字中間實現具體的屬性、方法;由於.m中使用了Person類,所以需要匯入聲明檔案“Person.h”;
成員變數

假設在Person類中包含人員姓名(name)、年齡(age)、民族(nation)、身高(height)四個成員變數,同時姓名和年齡兩個成員變數是私人的,身高是公開的,民族則限制為只有子類可以訪問。

#import <Foundation/Foundation.h>//由於使用了NSObject,所以匯入此標頭檔//NSObject是基類,Person實現了NSObject@interface Person : NSObject{    /*成員變數必須包含在大括弧中     *注意成員變數不聲明任何關鍵字的話是預設可訪問性@Protected     *注意在ObjC中不管是自訂的類還是系統類別對象都必須是一個指標,例如下面的_name     */    @private    NSString *_name;//在ObjC中推薦成員變數名以_開頭    int _age;    @protected    NSString *_nation;    @public    float height;}@end

成員變數定義在.h檔案中,同時必須定義在類後面的{}內。成員的可訪問性通過下面三個關鍵字聲明:

  • @private 私人成員,只有當前類可以訪問;
  • @protected 受保護的成員,只有當前類或子類可以訪問(如果沒有添加任何修飾則預設為@protected);
  • @public 公用成員,所有類均可訪問;

在ObjC中可訪問性修飾符除了這三種,還有一個@package不太常用,它類似於C#中的internal在架構內是公用的,但是架構外是私人的(也就是只能在一個架構內可以訪問)。那麼既然身高是公用的,外界怎麼訪問呢?

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        Person *p=[Person alloc];        p=[p init];        //上面兩句代碼可以直接寫成:Person *p=[[Person alloc] init];        //還可以寫成:Person *p=[Person new];                p->height=1.72;        NSLog(@"height=%.2f",p->height);//結果:height=1.72    }    return 0;}

這裡需要注意幾點:

  • ObjC中所有的物件類型的變數都必須加上“*”,在ObjC中對象其實就是一個指標(例如之前看到的NSString也是如此,但是基本類型不用加”*”);
  • ObjC中使用[]進行方法調用,在ObjC中方法調用的本質就是給這個對象或類發送一個訊息;
  • 在ObjC中類的執行個體化需要兩個步驟:分配記憶體、初始化;
  • 類的初始化調用了父類的init方法,如果使用預設初始化方法進行初始化(沒有參數),記憶體配置和初始化可以簡寫成[Person new];
  • 公用成員的調用使用“->”操作符;
方法和屬性

既然有了上面成員變數,假設現在需要一個對象方法去設定使用者姓名,還需一個類方法列印一些資訊。

在ObjC中方法分為靜態方法和動態方法兩種,動態方法就是對象的方法,靜態方法就是類方法,這一點跟其他進階語言沒有區別。在ObjC中使用“-”定義動態方法,使用“+”定義靜態方法。如果一個方法在.h中有聲明則該方法是公用方法,如果沒有在.h中聲明直接在.m中定義則該方法是私人方法,外部無法訪問。

person.h

#import <Foundation/Foundation.h>//由於使用了NSObject,所以匯入此標頭檔//NSObject是基類,Person實現了NSObject@interface Person : NSObject{    /*成員變數必須包含在大括弧中     *注意成員變數不聲明任何關鍵字的話是@Protected,其他還有@Private和@Public     *注意在ObjC中不管是自訂的類還是系統類別對象都必須是一個指標,例如下面的_name     */    @private    NSString *_name;//在ObjC中推薦變數名以_開頭    int _age;    @protected    NSString *_nation;    @public    float height;}//聲明一個動態方法,沒有傳回值-(void)setName:(NSString *)name;//聲明一個靜態方法,沒有傳回值+(void)showMessage:(NSString *)info;@end

Person.m

#import "Person.h"@implementation Person//實現一個動態方法-(void)setName:(NSString *)name{    _name=name;}//實現一個靜態方法+(void)showMessage:(NSString *)info{    NSLog(@"%@",info);}@end

在ObjC中方法的參數類型、傳回值類型需要放到()中,而且參數前必須使用冒號,並且此時冒號是方法名的一部分。當然,上面的方法只有一個參數,假設現在有一個方法可以同時設定年齡和籍貫,可以寫成如下形式:

-(void)setAge:(int)age andHeight:(NSString *)nation{    _age=age;    _nation=nation;}

其中andHeight可以省略不寫,當然為了保證方法名更有意義建議書寫時加上。

大家都知道在其他語言中還會經常提到屬性的概念,通常一個成員的訪問不會直接通過成員變數而是通過屬性暴漏給外界。在ObjC中屬性的實現方式其實類似於Java中屬性定義,通過對應的setter和getter方法進行實現。沒錯,上面setName其實就是屬性的setter方法,但是在ObjC中gettter方法通常使用變數名,而不加“get”。下面就看一下年齡屬性的實現

Person.h

 

#import <Foundation/Foundation.h>//由於使用了NSObject,所以匯入此標頭檔//NSObject是基類,Person實現了NSObject@interface Person : NSObject{    /*成員變數必須包含在大括弧中     *注意成員變數不聲明任何關鍵字的話是@Protected,其他還有@Private和@Public     *注意在ObjC中不管是自訂的類還是系統類別對象都必須是一個指標,例如下面的_name     */    @private    NSString *_name;//在ObjC中推薦變數名以_開頭    int _age;    @protected    NSString *_nation;    @public    float height;}//聲明一個動態方法,沒有傳回值-(void)setName:(NSString *)name;//聲明一個靜態方法,沒有傳回值+(void)showMessage:(NSString *)info;//聲明age的setter、getter方法-(int)age;-(void)setAge:(int)age;@end

 

Person.m

#import "Person.h"@implementation Person//實現一個動態方法-(void)setName:(NSString *)name{    _name=name;}//私人方法-(void)setAge:(int)age andHeight:(NSString *)nation{    _age=age;    _nation=nation;}//實現一個靜態方法+(void)showMessage:(NSString *)info{    NSLog(@"%@",info);}//實現age的setter、getter方法-(int)age{    return _age;}-(void)setAge:(int)age{    _age=age;}@en
// 這裡是具體調用
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person alloc]; p=[p init]; //上面兩句代碼可以直接寫成:Person *p=[[Person alloc] init]; //還可以寫成:Person *p=[Person new]; //成員變數調用 p->height=1.72; NSLog(@"height=%.2f",p->height);//結果:height=1.72 //方法調用 [p setName:@"Kenshin"]; //屬性調用 p.age=28; //等價於:[p setAge:28]; int age=p.age;//等價於:age=[p age]; NSLog(@"age=%i",age); //結果:age=28 } return 0;}

我們可以看到p.age的調用方式,是不是類似於C#、Java中屬性的調用方式,這就是ObjC中的點文法。其實這種方式調用的本質還是調用對應的方法進行處理,這麼做的目的只是為了開發人員書寫方便而已(這就是文法糖的目的)。至於p.age是調用get方法還是調用set方法完全取決於當前操作是賦值操作還是讀取操作。

通過上面的程式我們可以看到如果要定義一個屬性,首先需要在.h中聲明其次還要在.m中實現,而定義屬性的代碼基本都是類似的。

self關鍵字

在C#、Java中都有一個關鍵字this用於表示當前對象,其實在ObjC中也有一個類似的關鍵字self,只是self不僅可以表示當前對象還可以表示類本身,也就是說它既可以用在靜態方法中又可以用在動態方法中。

Perosn.h

#import <Foundation/Foundation.h>@interface Person : NSObject@property NSString *name;@property int age;-(void)setName:(NSString *)name andAge:(int)age;+(void)showMessage;@end

Person.m

#import "Person.h"@implementation Person-(void)setName:(NSString *)name andAge:(int)age{//    _name=name;//    _age=age;    self.name=name;    self.age=age;}+(void)printInfo{    NSLog(@"Hello,World!");}+(void)showMessage{    [self printInfo];}@end

main.m

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {    Person *p=[[Person alloc]init];    [p setName:@"Kenshin" andAge:28];    [Person showMessage];        return 0;}

在上面代碼中可以看到setName: andAge:方法是一個動態方法,此時self就代表調用對象;而在showMessage方法中self調用了類的靜態方法printInfo,此時self代表調用的類;因此可以總結出在ObjC中self就代表當前方法的調用者。

 

黑馬程式員---Objective-C基礎學習---類、對象、方法相關知識筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.