Objective-C 筆記二 類、對象和方法,objective-c筆記
對象就是一個物件。物件導向的程式設計可以看成一個物件和你想對它做的事情。這與C語言不同,C語言通常稱為過程性語言。在C語言中,通常是先考慮要做什麼,然後才關注對象,這幾乎總是與面相對象的思考過程相反。
在物件導向的用語中,(這裡我們以汽車作為對象)你的汽車是汽車的一個執行個體。car就是類的名稱,這個執行個體就是從該類建立的。因此,每製造一輛新汽車,就會建立汽車類的一個新執行個體,而且汽車的每個執行個體都稱為一個對象。
對象 |
使用對象執行的操作 |
你的汽車 |
駕駛 |
加油 |
洗車 |
維修 |
每個執行個體或對象不僅包含從製造商那裡獲得的有關原始特性的資訊,還包含它的當前特性,這些特性可以動態改變。當你駕駛汽車時,郵箱的油漸漸耗盡,汽車越來越髒,輪胎也逐漸磨損。
對象使用方法可以影響對象的狀態。如果方法是“給汽車加油”,那麼執行這個方法之後,汽車的郵箱會加滿。這個方法影響了汽車郵箱的狀態。
這裡關鍵的概念是:對象是類的獨特表示,每個對象都包含一些通常對該對象說是私人的資訊。方法提供訪問和改變這些資料的手段。
[ClassOrInstance method ];
在這條語句中左方括弧後要緊跟類的名稱或者該類的執行個體名稱,它後面可以是一個或多個空格,空格後面是將要執行的方法。最後,使用右方括弧和分號來終止。請求一個類或執行個體來執行某個操作時,就是在向它發送一條訊息,訊息的接收者稱為接收者。因此,有另一種方式可以表示前面所描述的一般格式:
[ receiver message ];
回顧上一個列表,使用這個新文法為它所編寫所有的方法。在此之前,你需要獲得一輛新車,去製造廠購買一輛:
yourCar = [Car new]; get a new car //這書寫的真詳細,不就是new一個對象麼!就是yourCar現在就是你的車,你可以用它引用汽車的執行個體。
有了新車就要有新車的方法,所以這個新方法可叫作製造廠方法,或者類方法:
[yourCar prep]; get it ready for first-time use
[yourCar drive]; drive your car
[yourCar wash]; wash your car
[yourCar getGas]; put gas in your car if you need it
[yourCar service]; service your car
[yourCar topDown]; if it's a convertible
[yourCar topUp];
currentMileage = [yourCar odometer];
最後一個樣本顯示的執行個體方法可返回資訊,即當前行駛裡程,這通過里程錶(odometer)可看出來。我們將該資訊儲存在程式中的currentMileage變數內。
這裡有一個將特定值作為方法參數的例子,與方法直接調用有所不同:
[yourCar setSpeed:55]; set the speed to 55 mph
你姐姐Sue可以對她自己的汽車執行個體使用相同的方法;
[suesCar drive];
[suesCar wash];
[suesCar getGas];
將同一個方法應用於不同的對象是物件導向程式設計背後的主要理念之一。
用於處理分數的Objective-C類
假設要編寫一個處理分數的程式,可能需要處理加、減、乘、除等運算。建立了一個Fraction類:
1 // 2 // Fraction.h 3 // 4 // Created by on 15/11/13. 5 // Copyright © 2015年 . All rights reserved. 6 // interface 部分 7 8 #import <Foundation/Foundation.h> 9 10 @interface Fraction : NSObject11 12 -(void) print;13 -(void) setNumerator :(int) n;14 -(void) setDenominator:(int) d;15 -(int) numberator;16 -(int) denominator;17 18 @end
1 // 2 // Fraction.m 3 // HelloWorld 4 // 5 // Created by on 15/11/13. 6 // Copyright © 2015年 . All rights reserved. 7 // 8 9 #import "Fraction.h"10 11 @implementation Fraction12 {13 int numberator;14 int denominator;15 }16 -(void) print{17 NSLog(@"%i/%i",numberator,denominator);18 }19 -(void) setNumerator:(int)n{20 numberator = n;21 }22 -(void) setDenominator:(int)d{23 denominator = d;24 }25 -(int) numberator26 {27 return numberator;28 }29 -(int) denominator30 {31 return denominator;32 }33 @end34 //----program 部分----35 #import <Foundation/Foundation.h>36 int main (int argc,const char * argv[])37 {38 @autoreleasepool {39 Fraction *myFraction;40 41 //建立一個分數執行個體 alloc分配空間 init初始化42 myFraction = [[Fraction alloc] init];43 //myFraction = [myFraction init];44 45 46 //Fraction *fact = [[Fraction alloc] init];47 48 //設定分數為1/349 [myFraction setNumerator:1];50 [myFraction setDenominator:3];51 52 // [fact setDenominator:3];53 // [fact setNumerator:7];54 55 //使用列印方法顯示分數56 NSLog(@"The value of myFraction is: %i/%i",[myFraction numberator],[myFraction denominator]);57 //[myFraction print];58 //59 // NSLog(@"Second fraction is:");60 // [fact print];61 }62 return 0;63 }
@interface部分用於描述類和類的方法;@implementation部分用於描述資料(類對象的實力變數儲存的資料),並實現在介面中聲明方法的執行個體代碼;program部分的程式碼實現了程式的預期目的。
@interface部分
一般格式類似於:
@interface NewClassName: ParentClassName
propertyAndMethodDeclarations;
@end
按照約定,類名一般以大寫字母開頭。
- 變數名的名稱規則:名稱必須以字母或底線(_)開頭,之後可以是任何(大寫或者小寫)字母、底線或者0~9之間的數字組合。
- 有些名稱不能用作於變數名,例如int。因為其用途對Objective-C編譯器而言有特殊含義,這種用法稱為保留名或保留字。(就是系統關鍵字)
- Objective-C中的大小寫字母是有區別的,變數名sum、Sum和SUM均表示不同的變數。
類方法和執行個體方法
-(void) print;
開頭的負號(-)通知Objective-C編譯器,該方法是一個執行個體方法。此外,還有一個選擇,就是正好(+),它表示類方法。類方法是對類本身執行某些操作的方法,例如,建立類的新執行個體。
1、傳回值
-(int) currentAge;
聲明新方法時,必須要告訴OC編譯器該方法是否有傳回值。括弧裡就是方法的傳回值類型!該方法指定名為currentAge的執行個體方法將返回一個整型值。
例:double雙精確度值,void代表無傳回型別。
2、方法的參數
-(void) setNumberator: (int) n;
這是一個無傳回值類型的執行個體方法,int用於指明參數類型。就setNumberator來說,其參數名就是n。這個名稱可以是任意的。
@implementation部分
@implementation部分包含聲明在@interface部分的方法的執行個體代碼,且需要指定儲存在類對象中的資料類型。(就是介面類,和實作類別)
@implementation部分的一般格式如下:
@implementation NewClassName
{
memberDeclarations;
}
methodDefinitions;
@end
memberDeclarations部分指定了哪種類型的資料將要儲存到Fraction中,以及這些資料類型的名稱。
program部分
program部分包含解決特定問題的代碼,如果有必要,它可以跨越多個檔案。其中必須在某個地方有一個名為main的函數,通常情況下,這是程式開始執行的地方。
Fraction *myFraction;
這一行表示myFraction是一個Fraction類型的對象。
myFraction = [[Fraction alloc] init];
alloc是allocate的縮寫,因為要為新分數分配記憶體儲存空間。
init方法用於初始化類的執行個體變數。注意,你正將init訊息發送給myFraction。也就是說,要在這裡初始化一個特殊的Fraction對象,因此,它沒有發送給類,而是發送給了類的一個執行個體。
init方法也可以返回一個值,即被初始化的對象。將傳回值儲存到Fraction的變數myFraction中。
讓我們重新回到Fraction *myFraction;
myFraction前的星號(*)表明myFraction是Fraction對象的引用(或指標)。變數myFraction實際上並不儲存Fraction的資料,而是儲存了一個引用(其實是記憶體位址),表明對象資料在記憶體中的位置。
好啦!其它的就是些設值方法(setter)和取值方法(getter),就不詳細說明啦,應該很好理解的。