一、類和對象
- 類的定義
- 類是對某個對象的定義。是某種類型的對象變量和方法的原型。類是從一些具有相同屬性或功能的具體實例,抽象出共有的一些屬性的,自定義抽象數(shù)據(jù)類型。
- 對象的定義
- 對象是具有類類型的變量。類和對象是面向?qū)ο缶幊碳夹g(shù)中的最基本的概念。
- 類和對象的關(guān)系:類是對象的抽象,而對象是類的具體實例。對象是對客觀事物的抽象,類是對對象的抽象。
- 簡單理解:類好比人類的骨架,對象好比人類的血肉。
- OC 中的類相當(dāng)于圖紙或框架,用來描述一類事物,要想創(chuàng)建對象必須先有類。
- OC 利用類來創(chuàng)建對象,對象是類的具體存在,因此面向?qū)ο蠼鉀Q問題因首先考慮需要設(shè)計那些類,再利用類來創(chuàng)建多少個對象。
二、 類的設(shè)計
- 1.如何設(shè)計一個類
- 生活中描述事物無非就是事物的 名稱/屬性 和 行為。
- 示例:車有長、寬,重量和顏色等屬性,有開車、聽廣播的行為
- OC中類的描述也是如此
- 屬性:對應(yīng)類中的成員變量。
- 行為:對應(yīng)類中的成員方法。
- 生活中描述事物無非就是事物的 名稱/屬性 和 行為。
- 2.如何分析一個類
- 一般名詞都是類(名詞提煉法)
- 示例:小明像魚塘扔了一塊石頭,砸暈了4條魚
- 提煉出來的類:小明、石頭、魚
- 示例:小明像魚塘扔了一塊石頭,砸暈了4條魚
- 擁有相同(或者相似)屬性(狀態(tài)和特征)和行為(能做什么事)的對象都可以抽象成為一個類
- 定義行為時的注意點:誰最清楚這個行為,那么該行為就屬于誰
- 一般名詞都是類(名詞提煉法)
三、類的聲明和實現(xiàn)
-
1.類的聲明: OC中定義一個類分為聲明和實現(xiàn)
- 編寫類的聲明:以 @interface 開頭,以 @end 結(jié)束,在 class name對應(yīng)的地方寫上事物的名稱,即類名稱。
- 類名的首字符必須大寫,OC類聲明中屬性只能寫在 @interface 和 @end 之間的 {} 中。
- 聲明一個類是在告訴系統(tǒng),這個類中有那些屬性和行為。
- 在編寫OC類屬性時,建議將所有屬性的名稱前面都加上下劃線: _
// 默認(rèn)情況下,OC對象中的屬性是不能直接訪問的, // 而類名后面的 :NSObject 是為了讓我們的 Iphone 類具備創(chuàng)建對象的能力。 @interface Iphone : NSObject { @public //只要讓類中的屬性公開,以后就可以直接通過一個指向結(jié)構(gòu)體的指針來操作對象 float _model; int _cpu; double _size; int _color; } -
2.類的實現(xiàn)
以 @implementation 開頭,以 @end 結(jié)束,在 class 對應(yīng)的地方寫上聲明類的名稱,必須和聲明的類名一模一樣。@implementation Iphone { }- 3.如何通過一個類來創(chuàng)建對象
- 在OC中想要通過一個類來創(chuàng)建一個對象,必須給類發(fā)送一個消息(類似C語言中調(diào)用方法)。想要發(fā)送消息就必須先寫上 [類名稱/對象名稱 方法名稱];,發(fā)送一個 new 消息可以創(chuàng)建一個對象。
示例: [Iphone new]; - 只要通過一個類調(diào)用類的 new 方法,像類發(fā)送一個叫 new 的消息后,系統(tǒng)會做如下事件:
- 為 Iphone 類創(chuàng)建出來的對象分配存儲空間
- 初始化 Iphone 類創(chuàng)建出來的對象中的屬性
- 返回 Iphone 類創(chuàng)建出來的對象對應(yīng)的地址
- 在OC中想要通過一個類來創(chuàng)建一個對象,必須給類發(fā)送一個消息(類似C語言中調(diào)用方法)。想要發(fā)送消息就必須先寫上 [類名稱/對象名稱 方法名稱];,發(fā)送一個 new 消息可以創(chuàng)建一個對象。
- 示例:通過一個 Iphone 類型的指針接收了 Iphone 對象的地址:*Iphone p = [Iphone new];
- 如果使用一個指針保存了某一個對象的地址,那么就稱這個指針為某個類型的對象
- 利用 Iphone 類型的指針保存了 Iphone 對象的地址,那么就稱 Iphone 類的指針 p 為 Iphone 的對象。
- OC中類的本質(zhì)是一個結(jié)構(gòu)體, 所以 p 這個指針其實就是指向了一個結(jié)構(gòu)體
struct Person { int age; char *name; }; struct Person sp; struct Person *sip = &sp; (*sip).name = "lee"; (*sip).age = 30; - 3.如何通過一個類來創(chuàng)建對象
四、創(chuàng)建一個OC方法
- 1.事物名稱:iPhone
- 屬性:顏色,型號,CPU,尺寸 == 成員變量
- 行為:打電話,發(fā)短信,上網(wǎng),獲取本機信息 == 成員方法
- 2.編寫類的聲明和實現(xiàn)
- 類的聲明和實現(xiàn)如上文所示
- C 語言函數(shù)分為:內(nèi)部函數(shù)和外部函數(shù);OC語言的方法分為: 類方法和對象方法。類方法只能用類名來調(diào)用,類方法用+表示;對象方法只能用對象來調(diào)用,對象方法用-表示。
- OC中的行為和C語言函數(shù)一樣,都是用來保存一段特定功能的代碼;C中的函數(shù)和OC中的方法都分為聲明和實現(xiàn)
- 編寫C語言函數(shù)的規(guī)律:1.確定函數(shù)名稱,2.確定形參,3.確定返回值,4.確定返回值類型
- 編寫OC語言函數(shù)的規(guī)律:1.確定函數(shù)名稱,2.確定形參,3.確定返回值,4.確定返回值類型
-
聲明一個類
eg-1.png
- 3.定義一個OC對象方法和類方法
- 對象方法
注意點: OC 中的方法,如果沒有形參不需要寫(),而是直接寫一個; , OC中的()有其他特殊用途,他是用來括住數(shù)據(jù)類型的。
//示例:
@interface Iphone
{
-(void)about;
//OC 中的方法如果有參數(shù),那么每個參數(shù)的數(shù)據(jù)類型前面必須加上:,并且:也是方法的名稱,signal:
-(int)signal:(int)nember;
}
@end
@implementation Iphone
{
-(void)about()
{
NSLog("打印本機信息!");
}
}
@end
- 類方法
- 如果不想每次使用方法都需要創(chuàng)建對象開辟存儲空間,并且如果該方法中沒有使用到屬性(成員變量),那么就可以把這個方法定義為類方法
- 定義類方法的寫法和對象方法一樣,只需要將前面-換成+即可
- 如果聲明的是對象方法,就必須實現(xiàn)對象方法;如果聲明的是類方法,就必須實現(xiàn)類方法。
//示例:
@interface Iphone
{
+(int)sumWithValue:(int)value1 :(int)value2;
}
@end
@implementation Iphone
{
+(int)sumWithValue:(int)value1 :(int)value2
{
return value1 + value2;
}
}
@end
- 類方法和對象方法的區(qū)別
- 0.對象方法以-開頭,類方法以+開頭
- 1.對象方法必須對象調(diào)用,類方法必須類調(diào)用
- 2.對象方法中可以直接訪問屬性(成員變量),類方法中不可以直接訪問屬性(成員變量)
- 3.類方法的優(yōu)點,調(diào)用類方法的效率會比調(diào)用對象方法高
- 4.類方法和對象方法可以進行互相調(diào)用
4.1 對象方法中可以直接調(diào)用類方法
4.2 可以在類方法中間接調(diào)用對象方法(企業(yè)開發(fā)中不建議這樣用)
4.3 類方法中可以直接調(diào)用其他類方法
4.4 對象方法中可以直接調(diào)用對象方法
- 類方法的應(yīng)用場景
- 如果方法中沒有使用到屬性(成員變量),那么能用類方法就用類方法,類方法的執(zhí)行效率比對象方法高
- 類方法一般用于定義工具方法:字符創(chuàng)的查找,文件操作,數(shù)據(jù)庫的操作
