iOS:知識點簡答

來源:互聯網
上載者:User

標籤:style   blog   color   io   os   使用   ar   java   strong   

1、堆和棧什麼區別?

 答:管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式員控制,容易產生memory leak。

 

2、數組和鏈表什麼區別?

 答:數組是將元素在記憶體中連續存放,由於每個元素佔用記憶體相同,可以通過下標迅速訪問數組中任何元素。

       鏈表恰好相反,鏈表中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起。

3、delegate和notification什麼區別,什麼情況使用?

答:Delegate:訊息的寄件者(sender)告知接收者(receiver)某個事件將要發生,delegate同意然然後寄件者響應事件,delegate機制使得接收者可以改變寄件者的行為。通常寄件者和接收者的關係是直接的一對多的關係。

Notification:訊息的寄件者告知接收者事件已經發生或者將要發送,僅此而已,接收者並不能反過來影響寄件者的行為。通常寄件者和接收者的關係是間接的多對多關係。


4、什麼是MVC,為什麼使用MVC,有什麼好處?

答: 分別為: 模型(Model),視圖(View)和控制Controller)。

          模型(Model) “資料模型”(Model)用於封裝與應用程式的商務邏輯相關的資料以及對資料的處理方法。

                                “模型”有對資料直接存取的權力,例如對資料庫的訪問。

          視圖(View) 視圖層能夠實現資料有目的顯示。

          控制器(Controller) 控制器起到不同層面間的組織作用,用於控制應用程式的流程。

降低對控制器的依賴,低耦合。

 

5、從一個數組中找出重複的元素列印出來

答:

 NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",@"7",@"4",@"5",@"2",@"6",@"5",nil];    NSMutableArray *arrmu = [[NSMutableArrayalloc]init];//過濾    NSMutableArray *sameArray = [[NSMutableArrayalloc]init];//找出相同的   for (int i = 0 ; i < [arrcount]; i++) {      id str = [arr objectAtIndex:i];       if ([arrmu count] == 0)        {            [arrmuaddObject:str];        }       else{           BOOL flag = NO;           for (int j = 0; j < [arrmucount]; j++ ) {               if ([strisEqual:[arrmu objectAtIndex:j]])                {                    [sameArrayaddObject:str];                    flag =YES;                   break;                }               else{                    flag =NO;                }            }           if (flag == NO) {                [ arrmuaddObject:str];            }        }    }   NSLog(@"sameArray : %@",sameArray);

還有兩種直接找出的方法,上代碼:

一:

    NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",nil];    NSSet *set = [NSSetsetWithArray:arr];    NSLog(@"%@",[setallObjects]);

 

二:

    NSArray *arr [email protected][@1,@2,@1];    NSMutableDictionary *dict = [NSMutableDictionarydictionary];    for (NSNumber *numberin arr) 
  { [dictsetObject:numberforKey:number]; } NSLog(@"%@",[dictallValues]);

6、UITableView能否綁定多個資料來源?

答:理論上可以達到。

7、一個UIViewController能否管理多個UITableView ?

答:可以

8、ios4、5、6相對於之前的版本添加了哪些新特性?
  這個就比較多了,比如:拋棄Google地圖 新推Maps應用 ,大幅加強中國本地化支援,Siri開口講普通話,通過iCloud體驗分享樂趣,Passbook電子票券管理,隨時隨地的FaceTime,電話功能增強,Safari支援全屏瀏覽,Mail應用新增VIP,萬能輔助:更強大等等了

 

9、同步請求和非同步請求什麼區別?

答:發送同步請求,程式將停止使用者互動,直至伺服器返回資料完成,才可以進行下一步操作;

      非同步請求不會阻塞主線程,而會建立一個新的線程來操作,使用者發出非同步請求後,依然可以對UI進行操作,程式可以繼續運行。


10、iOS中的多線程操作、多線程方式

答:iOS提供了方便的多線程調用機制:NSOperation和NSOperationQueue。它的使用方法也很簡單,一般都是將NSOperation對象加入到NSOperationQueue隊列中,加入後隊列就開始處理,知道任務操作完成。


11、UIViewController的生命週期

答:當一個視圖控制器被建立,並在螢幕上顯示的時候。 代碼的執行順序
    1、視圖在螢幕上顯示的順序

 1 alloc                   // 建立對象,分配空間。 2  3 init (initWithNibName)    //初始化對象,初始化資料。 4  5  loadView                  // 從nib載入視圖, 這一步不需要去幹涉。除非沒有使用xib檔案建立視圖。 6  7  viewDidLoad                //載入完畢,可以進行自訂資料以及動態建立其他控制項。 8  9 viewWillAppear            // 視圖將出現在螢幕之前,馬上這個視圖即將顯示在螢幕上。10 11 viewDidAppear             // 視圖已在螢幕上渲染完成。12 13     

2、視圖將被從螢幕上移除的順序

1 viewWillDisappear // 視圖將被從螢幕上移除之前執行。2 3 viewDidDisappear // 視圖已經被從螢幕上移除。4 5 dealloc // 視圖被銷毀,此時需要在init和viewDidLoad中建立的對象進行釋放。6 7 viewDidUnload // 出現記憶體警告在記憶體不足時執行,並對所有非當前顯示的controller執行。

本視圖的所有子視圖將被銷毀,以釋放記憶體,此時開發人員需要手動對viewLoad、viewDidLoad中建立的對象釋放記憶體。因為當這個視圖再次顯示在螢幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖。

 

12、Autorerelease對象什麼時候釋放?

答:autorelease實際上只是把對release的調用延遲了,對於每一個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被調用Release。


13、iOS資料持久化方式

  答:四種:屬性列表、對象歸檔、SQLite3和Core Data

 

14、Object-c的類可以多重繼承嗎?可以實現多個介面嗎?Category是什嗎?重寫一個類的方式用繼承好還是分類好?為什嗎?

 答:Object-c的類不可以多重繼承;可以實現多個介面,通過實現多個介面可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

 

15. #import 跟#include 又什麼區別,@class呢, #import<> 跟 #import”"又什麼區別?

 答:#import是Objective-C匯入標頭檔的關鍵字,#include是C/C++匯入標頭檔的關鍵字,使 用#import標頭檔會自動只匯入一次,不會重複匯入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,才去查看類的實現檔案,可以解決標頭檔的相互包含;#import<>用來包含系 統的標頭檔,#import””用來包含使用者標頭檔。

 

16.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼作用,在那種情況下用?

 答:readwrite 是可讀可寫特性;需要產生getter方法和setter方法時

readonly 是唯讀特性  只會產生getter方法 不會產生setter方法 ;不希望屬性在類外改變

assign 是賦值特性,setter方法將傳入參數賦值給執行個體變數;僅設定變數時;

retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy 表示賦值特性,setter方法將傳入對象複製一份;需要完全一份新的變數時。

nonatomic 非原子操作,決定編譯器產生的setter getter是否是原子操作,atomic表示多安全執行緒,一般使用nonatomic

 

17.常見的object-c的資料類型有那些, 和C的基礎資料型別 (Elementary Data Type)有什麼區別?如:NSInteger和int

 答:object-c的資料類型有 NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後便是對象,而C語言的基礎資料型別 (Elementary Data Type)int,只是一定位元組的記憶體空間,用於存放數值;而object-c的NSNumber包含有父類NSObject的方法和 NSNumber自己的方法,可以完成複雜的操作。

 18.Objective-C如何對記憶體管理的,說說你的看法和解決方案? 答:Objective-C的記憶體管理主要有三種方式ARC(自動記憶體計數)、手動記憶體計數、記憶體池。 解決方案的話: 誰持有,誰釋放。 19.如何對iOS裝置進行效能測試?

 答:Profile-> Instruments ->Time Profiler

 

20.Object C中建立線程的方法是什嗎?如果在主線程中執行代碼,方法是什嗎?如果想延時執行代碼、方法又是什嗎?

 答:線程建立有三種方法:使用NSThread建立、使用 GCD的dispatch、使用子類化的NSOperation,然後將其加入NSOperationQueue;在主線程執行代碼,方法是 performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone: 

 

21.描述一下iOS SDK中如何?MVC的開發模式

 答:MVC是:模型--視圖--控制  開發模式,對於iOS SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的使用者資料都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型資料。

  22.定義屬性時,什麼情況使用copy、assign、retain? 答:assign用於單一資料型別,如NSInteger,double,bool, 其實還有後面的block等;       retain和copy用於對象,copy用於當a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調用b會crash,如果用copy 的方式,a和b各自有自己的記憶體,  就可以解決這個問題。       retain 會使計數器加一,也可以解決assign的問題。       另外:atomic和nonatomic用來決定編譯器產生的getter和setter是否為原子操作。在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。       加了atomic,setter函數會變成下面這樣:    
 if (property != newValue) {       [property release];       property = [newValue retain];       }

 

23. Object-C有私人方法嗎?私人變數呢?

 答:objective-c – 類裡面的方法只有兩種, 靜態方法和執行個體方法,所有執行個體變數預設都是私人的,所有執行個體方法預設都是公有的。

 

24.淺拷貝和深拷貝區別是什麼

 答:淺拷貝:只複製指向對象的指標,而不複製引用對象本身。
?深拷貝:複製引用對象本身。

 

25.自動釋放池是什麼,如何工作

  答: 當您向一個對象發送一個autorelease訊息時,Cocoa就會將該對 象的一個引用放入到最新的自動釋放池。

        它仍然是個正當的對象,因此自動釋放池定義的範圍內的其它對象可以向它發送訊息。當程式執行到範圍結束的位置時,

        自動釋放池就會被釋放,池中的所有對象也就被釋放。

 

26.單件執行個體是什麼

 答: Foundation 和 Application Kit 架構中的一些類只允許建立單件(單例)對象,即這些類在當前進程中的唯一執行個體。

       舉例:NSFileManager 和NSWorkspace類在使用時都是基於進程進行單件對象的執行個體化。

       當向這些類請求執行個體的時候,它們會向您傳遞單一執行個體的一個引用,如果該執行個體還不存在,則首先進行執行個體的分配 和初始化。

 

27.類別的作用?繼承和類別在實現中有何區別?
 答:category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,只能添加,不能刪除修改。?

      並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因為類別具有更高的優先順序。?類別主要有3個作用:

      ?(1)將類的實現分散到多個不同檔案或多個不同架構中。?

      (2)建立對私人方法的前向引用。

      ?(3)向對象添加非正式協議。? 

      繼承可以增加,修改或者刪除方法,並且可以增加屬性。

 

28.類別和類擴充的區別。
 答:category和extensions的不同在於 後者可以添加屬性。另外後者添加的方法是必須要實現的。?extensions可以認為是一個私人的Category。

 

29.KVO and KVC??
 答:kvc:鍵 - 值編碼是一種間接訪問對象的屬性,使用字串來識別屬性,而不是通過調用存取方法,直接或通過執行個體變數訪問的機制。?很多情況下可以簡化程式碼。apple文檔其實給了一個很好的例子。?kvo:索引值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。?具體用看到用到過的一個地方是對於按鈕點擊變化狀態的的監控。?比如我自訂的一個
UIButton *button = [[UIButton alloc] init]; ?[button addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; ? ? ?#pragma mark - KVO ? ?- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context ?{  ?    if ([keyPath isEqualToString:@"highlighted"] ) { ?          UIButton *button = (UIButton *)object;          NSLog(@"%d",button.highlighted);   }  }
對於系統是根據keypath去取的到相應的值發生改變,理論上來說是和kvc機制的道理是一樣的。?對於kvc機制如何通過key尋找到value:?“當通過KVC調用對象時,比如:[self valueForKey:@”someKey”]時,程式會自動試圖通過幾種不同的方式解析這個調用。首先尋找對象是否帶有 someKey 這個方法,如果沒找到,會繼續尋找對象是否帶有someKey這個執行個體變數(iVar),如果還沒有找到,程式會繼續試圖調用-(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現的話,程式會拋出一個NSUndefinedKeyException異常錯誤。?  (註:Key-Value Coding尋找方法的時候,不僅僅會尋找someKey這個方法,還會尋找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,尋找執行個體變數的時候也會不僅僅尋找someKey這個變數,也會尋找_someKey這個變數是否存在。)? ?設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最後的機會響應這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處。“?來至cocoa,這個說法應該挺有道理。     ?因為我們知道button卻是存在一個highlighted執行個體變數.因此為何上面我們只是add一個相關的keypath就行了,     ?可以按照kvc尋找的邏輯理解,就說的過去了。 30.代理的作用?
 答:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要擷取到那些類的指標。可以減少架構複雜度。?另外一點,代理可以理解為java中的回調監聽機制的一種類似。 31.說說響應鏈?
答: 事件響應鏈。包括點擊事件,畫面重新整理事件等。在視圖棧內從上至下,或者從下之上傳播。 32.frame和bounds有什麼不同??
答:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)?bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統) 33.方法和選取器有何不同??
答:selector是一個方法的名字,method是一個組合體。 34.Object-c的類可以多重繼承嗎?可以實現多個介面嗎?重寫一個類的方式用繼承好還是分類好?為什嗎?
答:Objective-c只支援單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這裡是用protocol 委託代理 來實現的。 35.ARC自動引用計數答:1.ARC是編譯特性,不是運行時特性,只是在編譯的時候,編譯器會自動加上釋放代碼
    2.不能調用release、retain、autorelease、retainCount
    3.dealloc注意
     1> 不能在dealloc中調用[super dealloc]
     2> 不能在dealloc中釋放資源
   [email protected]參數說明
    1> retain 改為 strong
    2> 基礎資料型別 (Elementary Data Type)(int\float)還是用assign
    3> copy 還是 copy
    4> 如果2個對象循環參考,一端用strong,一端用weak
    5> weak是用在對象上,weak其實作用跟assign相當 

iOS:知識點簡答

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.