oc中面向?qū)ο笥腥筇匦韵趾幔瑸榉庋b漓拾,繼承,多態(tài)戒祠。 ? 封裝也是成員變量的封裝(保護成員變量不能被外界隨便賦值晦攒。)
1: 封裝
1>:set 方法:給外界提供一個方法給外界設(shè)置成員變量的值。
? ? ? ? ? ? ? ? ? 方法名必須以set 開頭得哆。
? ? ? ? ? ? ? ? ? set 后面跟上成員變量名,且成員變量名首字母必須大寫哟旗。
? ? ? ? ? ? ? ? ? set 方法返回值類型必為void贩据。
? ? ? ? ? ? ? ? ? 一定要接收一個參數(shù),且參數(shù)類型跟成員變量類型一致闸餐。
? ? ? ? ? ? ? ? ?形參的名稱不能與成員變量名一樣饱亮。
在 set 方法實現(xiàn)中可以對參數(shù)進行過濾。成員便令不能用@public 時舍沙,成員變量可被外面的指針變量任意賦值近上。
set 方法可以監(jiān)聽成員變量的改變。
2>: ?get 方法: ?返回對象內(nèi)部的成員的變量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?肯定有返回值拂铡,且返回值類型與成員變量類型一致壹无。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不需要有形參。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?方法名就是成員變量名感帅。
封裝有set 方法來設(shè)置成員變量斗锭,用 get 方法來訪問成員變量。把對象的成員變量隱藏在里面失球,不顯示細節(jié)岖是。保證數(shù)據(jù)的安全性。
只讀: ?只允許外界訪問對象的某個屬性实苞,不允許外界修改這個成員變量的值豺撑。這時可以只提供get 方法不提供set 方法。
成員變量的命名黔牵,必須要以下劃線開頭聪轿,這樣可以跟局部變量區(qū)分開來,還跟get 方法區(qū)分開猾浦。帶下劃線的一般都是成員變量屹电。
oc是弱語法阶剑,oc中的方法調(diào)用時動態(tài)檢測的,運行時的過程中才會檢測對象有沒有實現(xiàn)相應(yīng)的方法危号。
例如:
@interface ?Person ?: NSObject?
?@end?
@implementation ? Person?
? ? ?@end?
int ?main ()
{
? ? Person ?* s = ? [ person ?new ];
?[s ?test ];
? return 0;
? ? ?}
?這個程序中類的聲明中什么也沒有牧愁。類的實現(xiàn)也是空的⊥饬可是編譯時只有一個警告猪半,如果加上test 方法的聲明,則編譯無錯誤偷线。鏈接時也可以通過磨确,可是運行時會出現(xiàn)系統(tǒng)崩潰。因為找不到test 方法声邦。 ?如果沒有 test 方法的聲明乏奥,但是有類的實現(xiàn)也是可以的,但是此時亥曹,類的實現(xiàn)必須在 main ?函數(shù)之前邓了。但是這樣不規(guī)范、
封裝的好處:把一個功能封裝到一個方法中去媳瞪。
? ? ? ? ? ? ? ? ? ? ? ? 過濾不合理的值骗炉。
? ? ? ? ? ? ? ? ? ? ? ? ?讓外界不必關(guān)注內(nèi)部的細節(jié)。
類方法:可以直接用類名調(diào)用的方法蛇受。類本身會在內(nèi)存中占據(jù)存貯空間句葵,里面有方法的列表。
類方法以加號開頭兢仰,只能讓類調(diào)用乍丈,類方法可以與對象方法同名。在類方法中不能直接調(diào)用成員變量把将,诗赌。
例如:?
?+ void ?run?
{
? NSLog (@'' ?跑起來了");
}
? 類方法的好處:
? ?不依賴于對象秸弛,執(zhí)行效率高铭若。
? 能用類方法盡量類方法。
? 當(dāng)方法內(nèi)部不需要使用到成員變量時递览,就可以改為類方法叼屠。
? 工具類:基本沒有成員變量,里面的方法基本都是類方法绞铃。
?易錯:
+ void ?run?
{ ?
?[ ?person ?run ?];
? NSLog (@'' ?跑起來了")镜雨;
}
? ? 運行時什么也不輸出,類方法自己調(diào)用自己儿捧,死循環(huán)荚坞。
+ void ?run?
{ ?
NSLog (@'' ?跑起來了")挑宠;
?[ ?person ?run ?];
?}
運行中先輸出,在自己調(diào)用自己颓影,也是死循環(huán)各淀。
? self ?關(guān)鍵字
當(dāng)成員變量與局部變量同名時,采取就近原則诡挂。訪問的事局部變量碎浇。用self 訪問成員變量可以區(qū)分同名的局部變量。
self 只能出現(xiàn)在oc方法中璃俗,不能在函數(shù)中使用奴璃。
self -> 成員變量名: 訪問當(dāng)前對象內(nèi)部的成員變量。
[ self ?方法名]城豁;
// ? 誰調(diào)用了當(dāng)前方法 苟穆,self 就代表誰,類方法中就代表類唱星,對象方法中就代表方法雳旅。
- void ?run?
{ ?
NSLog (@'' ?跑起來了");
?[ ?self ? run ?];
?}?
死循環(huán)自己調(diào)用自己.
2:繼承
繼承是類和類之間的關(guān)系
例如:
?@interface ?Person ?: NSObject?
? ? ? ? ? ? {
? ? ? ? ? ? ? int ?age ;
? ? ? ? ? ? ? double ?weight;
? ? ? ? ? ?}
? ? ? ? ?- void ?test ;
? ? ? ? ? ? @end?
@implementation ? Person?
- void ?test?
{?
NSLog (@'' ?調(diào)用 了人的 test 函數(shù)")魏颓;
}
? ? ?@end?
@interface ? student ?:?Person?
? ? ? ? ? ? @end?
@implementation ? Person?
- void ?test?
{?
NSLog (@'' ?調(diào)用 了學(xué)生的 test 函數(shù)");
}
? ? ?@end?
繼承的好處:student ?繼承了person 的類吱晒,student 成為子類甸饱,person 成為父類。
?注意: 父類應(yīng)寫在子類之前仑濒,因為編輯器是從上往下編譯的叹话,所以父類先定義,子類才能使用墩瞳。
? ? ? ? ? ? ? oc中不允許父類和子類中有相同的成員變量驼壶。
? ? ? ? ? ? ?子類中允許子類跟父類中有相同的實現(xiàn)方法、
? ? ? ? ? ?如果在子類中調(diào)用某個方法喉酌,會優(yōu)先在子類中找有沒有這個方法的實現(xiàn)热凹。找不到的話就去父類中找。每個類中都有一個super 指針泪电,指向它的父類般妙。 也可以在父類中聲明某個方法,但不在父類中實現(xiàn)相速。在子類中實現(xiàn)碟渺。然后在子類中調(diào)用。但是編譯時會有警告突诬。
? ? ? ? 子類重現(xiàn)實現(xiàn)父類中的某個方法苫拍,會覆蓋父類的方法芜繁,優(yōu)先使用子類的。
? 注意:
1: 父類必須聲明在子類之前绒极,實現(xiàn)可在子類后面骏令。
2:調(diào)用某個對象的方法時,會優(yōu)先去當(dāng)前對象對應(yīng)的類中找集峦,如果找不到就順著super 指針去父類中找伏社。
? ?繼承的好處: 抽取了重復(fù)代碼,建立了類之間的關(guān)系塔淤。
? ? ? ? ? ? ? ?缺點: 類之間的耦合性太強摘昌。
?使用場合:
1: 當(dāng)兩個類擁有相同的屬性和方法時,就可以將相同的東西放在一個父類中高蜂。
2:當(dāng)A類擁有B類的部分屬性和方法時聪黎,可以考慮讓B類繼承A類。
使用注意:
?? ??@interface Score: NSObject
? ? ? ? ? ? {
? ? ? ? ? ? ? int ?-cscore ;
? ? ? ? ? ? ? ?int ?-ocscore;
? ? ? ? ? ?}
? ? ? ? ?- void ?test ;
? ? ? ? ? ? @end?
@implementation ? Score
- void ?test?
{?
NSLog (@'' ?調(diào)用 了test 函數(shù)")备恤;
}
? ? ?@end?
@interface Student: NSObject
? ? ? ? ? ? {
? ? ? ? ? ? ? int ?-cscore ;
? ? ? ? ? ? ? ?int ?-ocscore;
? ? ? ? ? ?}
? ? ? ? ?- void ?test ;
? ? ? ? ? ? @end?
@implementation ? Student
- void ?test?
{?
NSLog (@'' ?調(diào)用 了人的 test 函數(shù)")稿饰;
}
? ? ?@end?
雖然這兩個類具有相同的屬性,可是不能用student 繼承score ,因為邏輯上不對露泊。
3:多態(tài)
沒有繼承就沒有多態(tài)喉镰,多態(tài)是指父類指針指向子類對象。
多態(tài)的好處:如果參數(shù)中使用的事父類類型惭笑,可以傳入子類侣姆,父類的對象。