1.#import有兩個用途,第一個用途:與C 語言中的 include 完全一樣。第二個用途:可以自動防止文件內容被重復拷貝,也就是說多次書寫#import <Foundation/NSObjCRuntim.h>就只拷貝一次,相當于只寫了一次。
2.類方法的好處和使用場合
(1) 不依賴于對象,執行效率高(2) 能用類方法,盡量用類方法(3) 場合:當方法內部不需要使用到成員變量時,就可以改為類方法
可以允許類方法和對象方法同名3.self的用途:(1) 誰調用了當前方法,self就代表誰* self出現在對象方法中,self就代表對象* self出現在類方法中,self就代表類
(2) 在對象方法利用"self->成員變量名"訪問當前對象內部的成員變量
(3)[self方法名]可以調用其他對象方法/類方法
使用 self 與 super調用方法的區別:使用 self 調用方法時,self先從當前類中尋找方法,如果沒有尋找到再去父類中尋找。而super直接在父類中尋找方法。
4.super的作用1.直接調用父類中的某個方法2.super處在對象方法中,那么就會調用父類的對象方法
super 處在類方法中,那么就會調用父類的類方法
3.使用場合:子類重寫父類的方法時想保留父類的一些行為
5.多態
多態就是用父類類型的指針創建子類的對象,比如Dog類繼承了Animal類,下面都是多態:
Animal *aa = [Dog new];
Dog *dd = (Dog *)aa;
1.沒有繼承就沒有多態2.代碼的體現:父類類型的指針指向子類對象3.好處:如果函數/方法參數中使用的是父類類型,可以傳入父類、子類對象4.局限性:父類類型的變量不能直接調用子類特有的方法。必須強轉為子類類型變量后,才能直接調用子類特有的方法
6.
在 xcode4.4 之后,@PRoperty的功能更加強大,它同時具有了@synthesize的功能,比如@property int age;具有如下三個功能:(1)生成_age成員變量的get和 set 方法的聲明(2)生成_age成員變量的get和 set 方法的實現
(3) 生成一個名為_age的成員變量
7.
@property的參數:
(1) set方法內存管理相關的參數
(a) retain:release舊值,retain新值(適用于OC 對象類型)(b) assign:直接賦值(默認,適用于非OC 對象類型),常用在 BOOL、int等基本數據類型。(c) copy:release舊值,copy新值,常用在NSString對象
(2) 是否要生成set方法(a) readwriter:同時生成set和 get 方法的聲明和實現(b) readonly:只生成get的聲明和實現
(3) 多線程管理(a) nonatomic:性能高(一般都是使用這個)(b) atomic:性能低(默認)
(4) set和 get 方法的名稱(a) setter:決定了set方法的名稱,一定要加個冒號“:“(b) getter:決定了get方法的名稱,不要加冒號
(5) strong和 weak(a) strong:用于一般對象
(b) weak:用于UI 控件
8.默認情況下,除字符串對象外,使用NSLog和%@打印對象的結果都是<類名 對象所在內存地址>。使用NSLog和%@打印對象的步驟如下:1.調用對象p的-description方法2.拿到-description方法的返回值(NSString *)顯示到屏幕上3.-description方法默認返回的是“類名+內存地址
在必要情況下,我們需要重寫description方法以達到改變輸出結果目的,
還有一個以“+”開頭的description,“+”開頭的description決定的是類對象的輸出結果,“-”開頭的description決定的是實例對象的輸出結果。
當然也可以像重寫“-”開頭的description一樣去重寫它?!緜渥ⅰ款愐彩菍ο螅魏晤惗际?Class的對象,獲得類對象(和類的對象不是同一個概念)的方法為
Class c = [Person class];
9、SELSEL其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址。找到方法地址就可
以調用方法, 其實消息就是SEL。對于下列方法調用:
[p test2];
主要有以下步驟:1.把test2包裝成SEL類型的數據2.根據SEL數據找到對應的方法地址3.根據方法地址調用對應的方法比如一個類中有兩個方法:+test和-test2每個方法在內存中的地址都有一個對應的SEL與之對應
SEL s1 == +test地址
SEL s2 == -test2地址
對象找要調用的方法時,isa指針會根據調用的方法名在類中找到相關的SEL對象(方法地址)去調用。所以,調用方法還可以用如下形式:
[p performSelector:@selector(test2)];
performSelector:@selector(test2)返回的就是test2的方法地址。如果方法還有參數,比如- (void)test3:(NSString *)abc,還可以按照如下格式調用:
[p performSelector:@selector(test3:) [Object:@”abc”]];
對于上述調用方法,test3后一定要加”:“,因為”:”也是有參數方法的方法名的一部分。
10、內存管理(高頻面試題)
無論是 ios 還是 android 中,系統對每個程序運行時內存的占用都有一個限制,默認都是幾十M 左右大小,當程序占用的內存的大小超過限制時,程序可能就會被強制退出。拿 iphone4來說,當程序內存占用超過40M時,會出現內存警告,當內存占用達到45M,還會再一次內存警告,對于以上兩次警告如果不做出釋放內存操作,當達到120M時,系統會自動kill掉程序。在內存中,分為堆和棧,棧中主要存放變量,堆中主要存放對象。棧中的東西是系統自動回收的,當一個變量使用完畢后,存放在棧中的東西會立刻被回收。但堆中存儲的東西是不會隨便回收的。
每個 OC 對象里都有一個引用計數器,是一個整數,用來統計正在被引用多少次,每個引用計數器占用4個字節,對象剛剛創建時引用計數器默認為1。如果OC 對象引用計數器為 0 時,系統就可以回收這個對象了。引用計數器的操作:
(1) 給對象發送一條 retain 消息,可以使引用計數器值+1(retain方法返回對象本身)(2)給對象發送一條release消息,可以使引用計數器值-1(3) 給對象發送一條retainCount消息,可以獲得當前的引用計數器值
對象的銷毀:
(1) 當一個對象的引用計數器的值為0 時,那么它將被銷毀,其占用的內存會被系統回收。(2)當一個對象被銷毀時,系統會自動向對象發送一條dealloc消息
(3) 一般會重寫 dealloc 方法,在這里釋放相關資源,dealloc就像對象的遺言。(4)一旦重寫了dealloc方法,就必須調用[super dealloc],并且放在最后面調用。(5)不要直接調用dealloc方法。(6)一旦對象被回收了,它占用的內存不再可用,堅持使用就會導致程序崩潰(指針錯誤)。概念:僵尸對象:所占用的內存已經被回收的對象,僵尸對象不能再使用野指針:指向僵尸對象的指針,給野指針發送消息會報錯空指針:沒有指向任何東西的指針(存儲的東西是 nil、null、0),給空指針發送消息不會報錯?!緜渥ⅰ縩il與 null 不同,null是一個宏定義,值為0,nil表示無值,任何變量在沒有賦值之前都是nil,對于真假判斷,只有nil和 false 表示假,其他均為真。內存管理原則:(1)誰創建,誰release:如果你通過 alloc、new或[mutable]copy來創建一個對象,那么必須調用release或 autorelease(2)誰retain,誰release:只要你調用了 retain,無論這個對象如何生成的,你都要調用release。綜上:有始有終,有加就有減。曾經讓對象計數器+1,就必須在最后讓對象計數器-1。
新聞熱點
疑難解答