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