Objective--C三大特性:封装,继承,多态(零碎笔记)
OC中類的特性共有有三個(gè),它們分別是封裝、繼承和多態(tài)。
封裝:封裝就是對(duì)類中的一些字段,方法進(jìn)行保護(hù),不被外界所訪問(wèn)到,有一種權(quán)限的控制功能。
OC中有四種訪問(wèn)權(quán)限修飾符:@public、@protected、@private、@package
要注意的是:OC中的方法是沒(méi)有修飾符的概念的,這個(gè)和Java有很大的區(qū)別,一般都是公開(kāi)訪問(wèn)的,即public的,但是我們?cè)趺醋龅阶孫C中的一個(gè)方法不能被外界訪問(wèn)呢?
OC中是這么做的,如果想讓一個(gè)方法不被外界訪問(wèn)的話,只需要在.m文件中實(shí)現(xiàn)這個(gè)方法,不要在頭文件中進(jìn)行定義,說(shuō)白了就是:該方法有實(shí)現(xiàn),沒(méi)定義,這樣外界在導(dǎo)入頭文件的時(shí)候,是沒(méi)有這個(gè)方法的,但是這個(gè)方法我們可以在自己的.m文件中進(jìn)行使用。(和IOS中的單例模式有關(guān))
繼承:繼承是類中的一個(gè)重要的特性,他的出現(xiàn)使得我們沒(méi)必要?jiǎng)e寫(xiě)重復(fù)的代碼,可重用性很高。
1、成員變量的作用域。成員變量的作用域應(yīng)該也是封裝的一種,它對(duì)成員變量的作用范圍做出了一些限制。
@public : 在任何地方都可以直接訪問(wèn)成員變量。
@protected:在本類和子類中可以直接訪問(wèn)。
@private:只能在本類中訪問(wèn)。
@package:在同一個(gè)框架內(nèi)可以訪問(wèn)。
默認(rèn)情況下在類的聲明中定義的成員變量的修飾符是@protected,在類的實(shí)現(xiàn)中定義的成員變量的修飾符是@private。
總結(jié):(1)封裝是為了保護(hù)類中的屬性,不讓外界直接對(duì)屬性進(jìn)行訪問(wèn)和賦值。但是我們可以利用set和get來(lái)對(duì)屬性進(jìn)行賦值和取值。
(2)set方法里可以寫(xiě)上對(duì)屬性的判斷,以免我們輸入一些不合理的值給屬性。
(3)成員變量的作用域的修飾符有四種,默認(rèn)情況下在類的聲明中定義的成員變量的修飾符是@protected,在類的實(shí)現(xiàn)中定義的成員變量的修飾符是@private。
2、繼承有什么好處和壞處?
好處:1)我們可以明確的表示兩個(gè)類之間的關(guān)系。2)子類可以繼承父類的屬性和方法,提高了代碼的復(fù)用率。
壞處:會(huì)增加程序的耦合性。也就是說(shuō)當(dāng)有一天我們?nèi)绻麆h除了父類,那么子類也將不能再使用,這就是繼承的缺點(diǎn)。
3、繼承的注意點(diǎn):
1)父類必須聲明在子類的前面。
2)子類的不能重寫(xiě)成員變量,因?yàn)樽宇愔胁辉试S有跟父類同名的成員變量。
3)繼承不是兩個(gè)類有相同的屬性和方法就可以確定繼承關(guān)系的。比如說(shuō)狗中有名字和年齡屬性,還有跑和吃飯的方法,這些屬性和方法人也可以擁有,但是可以讓人繼承狗這個(gè)類嘛,所以繼承還要考慮事物之間的關(guān)系。
4、多態(tài)的特點(diǎn):
1)沒(méi)有繼承就沒(méi)有多態(tài)。
2)父類類型的變量不能直接調(diào)用子類的方法,必須要強(qiáng)制轉(zhuǎn)化為子類類型才可以。
3)如果函數(shù)和方法形參列表中是父類的類型,則可以傳入父類或子類的對(duì)象。
上面就是繼承和多態(tài)的介紹。
總結(jié):
(1)繼承是指一個(gè)類完全地?fù)碛辛硪粋€(gè)類的屬性和方法。
(2)繼承時(shí)子類可以重寫(xiě)父類的方法,如果要調(diào)用父類的方法,可以用super。
(3)繼承不可以亂用,我們要理解兩個(gè)類之間的關(guān)系,不是一個(gè)類有了另一類的屬性和方法就可以繼承的。
(4)繼承只允許單繼承,不能夠同時(shí)繼承多個(gè)類。
(5)多態(tài)是在繼承的基礎(chǔ)上實(shí)現(xiàn)的。
(6)多態(tài)可以在運(yùn)行時(shí)根據(jù)對(duì)象的類型動(dòng)態(tài)調(diào)用方法。
(7)多態(tài)不可以直接調(diào)用子類的屬性和方法。
內(nèi)存管理總結(jié):
1、OC中是需要進(jìn)行內(nèi)存管理的,內(nèi)存管理的范圍是任何OC對(duì)象。
2、有alloc就一定要有release,有retain就一定要有release。
3、引用計(jì)數(shù)器占用四個(gè)字節(jié),它是用來(lái)表示對(duì)象被引用的次數(shù)的,如果為0系統(tǒng)就會(huì)自動(dòng)釋放內(nèi)存。
4、對(duì)象引用另一個(gè)對(duì)象的時(shí)候,要在set方法里面寫(xiě)該對(duì)象的retain,在dealloc中寫(xiě)上該對(duì)象的release。
5、@property的參數(shù)有很多,對(duì)于基本數(shù)據(jù)類型的變量我們寫(xiě)上 nonatomic和assign,對(duì)于OC對(duì)象我們寫(xiě)上nonatomic和assign。其中nonatomic是高性能的意思,它用在多線程管理 上,assign是直接賦值的意思,retain是release舊值,retain新值的意思。
構(gòu)造方法的幾個(gè)重點(diǎn):
1、如果需要在初始化的時(shí)候就給成員變量賦值,我們就要重寫(xiě)init方法,也就是構(gòu)造方法。
2、重寫(xiě)構(gòu)造方法的時(shí)候一定要調(diào)用父類的構(gòu)造方法。
3、設(shè)計(jì)構(gòu)造方法的時(shí)候記得父類的屬性交給父類處理。
4、構(gòu)造方法必須是對(duì)象方法。
SEL其實(shí)是對(duì)方法的一種包裝,它是將方法包裝成一個(gè)SEL類型的數(shù)據(jù),根據(jù)這個(gè)數(shù)據(jù)我們可以找到對(duì)應(yīng)的方法地址。SEL也就是消息。下面我們根據(jù)SEL來(lái)調(diào)用對(duì)象的方法。
// Person類的實(shí)現(xiàn)
@implementation Person
- (void)eat
{
??? NSLog(@"%@在吃飯", _name);
}
@end
int main()
{
??? Person *p = [[Person alloc] init];
??? p.name = @"張三";
???
??? [p performSelector:@selector(eat)]; // 把方法名包裝成一個(gè)SEL類型的數(shù)據(jù)并進(jìn)行調(diào)用
???
??? return 0;
}
description是什么呢?它有兩種,一種是類方法,一種是對(duì)象方法。
1、使用NSLog和%@輸出某個(gè)對(duì)象時(shí),會(huì)調(diào)用對(duì)象的-description方法,并拿到返回值進(jìn)行輸出。返回值是:<類名: 對(duì)象地址>。
2、使用NSLog和%@輸出某個(gè)類對(duì)象時(shí),會(huì)調(diào)用類對(duì)象+description方法,并拿到返回值進(jìn)行輸出。返回值是:類名。
我們可以重寫(xiě)description方法來(lái)讓對(duì)象名和類對(duì)象名輸出我們想要的結(jié)果。比如說(shuō):
// Person類的實(shí)現(xiàn)
@implementation Person
- (void)eat
{
??? NSLog(@"%@在吃飯", _name);
}
?
// 重寫(xiě)description方法返回我們需要的東西
- (NSString *)description
{
??? return [NSString stringWithFormat:@"_name = %@", _name];
}
@end
?
int main()
{
??? Person *p = [[Person alloc] init];
??? p.name = @"張三";
???
??? NSLog(@"%@", p); // 輸出結(jié)果是:_name = 張三
???
??? return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/songlei0601/p/5751193.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Objective--C三大特性:封装,继承,多态(零碎笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 另存为常用位置设置 1.0 绿色版
- 下一篇: 最简单的基于FFMPEG的Hellowo