天天看點

iOS 必備技術點

IOS面試問題總結

分類: IOS開發2013-11-20 17:26 5873人閱讀 評論(1) 收藏 舉報

目錄(?)[+]

通過網絡搜尋和自己總結經曆找了一些IOS面試經常被問道的問題:

1.搞清楚touch事件的傳遞(事件的響應鍊)

iOS 必備技術點
事件的響應(responder chain)
iOS 必備技術點
iOS 必備技術點

隻有繼承了UIResponder的類才能響應touch事件,從上圖的響應者鍊可以看出,優先是最上層的view響應事件,如果該view有視圖控制器的話會是下一個響應者,否者就是該view的父視圖,這樣至上而下傳遞事件。直到單例UIWindow對象,最後是單例UIApplication對象以終止,UIApplication的下一個響應者是nil,已結束整個響應循環。事件在傳遞過程中視圖可以決定是否需要對該事件進行響應。

事件分發(Event Delivery)

第一響應者(First responder)指的是目前接受觸摸的響應者對象(通常是一個UIView對象),即表示目前該對象正在與使用者互動,它是響應者鍊的開端。整個響應者鍊和事件分發的使命都是找出第一響應者。

UIWindow對象以消息的形式将事件發送給第一響應者,使其有機會首先處理事件。如果第一響應者沒有進行處理,系統就将事件(通過消息)傳遞給響應者鍊中的下一個響應者,看看它是否可以進行處理。

iOS系統檢測到手指觸摸(Touch)操作時會将其打包成一個UIEvent對象,并放入目前活動Application的事件隊列,單例的UIApplication會從事件隊列中取出觸摸事件并傳遞給單例的UIWindow來處理,UIWindow對象首先會使用hitTest:withEvent:方法尋找此次Touch操作初始點所在的視圖(View),即需要将觸摸事件傳遞給其處理的視圖,這個過程稱之為hit-test view。

UIWindow執行個體對象會首先在它的内容視圖上調用hitTest:withEvent:,此方法會在其視圖層級結構中的每個視圖上調用pointInside:withEvent:(該方法用來判斷點選事件發生的位置是否處于目前視圖範圍内,以确定使用者是不是點選了目前視圖),如果pointInside:withEvent:傳回YES,則繼續逐級調用,直到找到touch操作發生的位置,這個視圖也就是要找的hit-test view。

hitTest:withEvent:方法的處理流程如下:

首先調用目前視圖的pointInside:withEvent:方法判斷觸摸點是否在目前視圖内;

若傳回NO,則hitTest:withEvent:傳回nil;

若傳回YES,則向目前視圖的所有子視圖(subviews)發送hitTest:withEvent:消息,所有子視圖的周遊順序是從最頂層視圖一直到到最底層視圖,即從subviews數組的末尾向前周遊,直到有子視圖傳回非空對象或者全部子視圖周遊完畢;

若第一次有子視圖傳回非空對象,則hitTest:withEvent:方法傳回此對象,處理結束;

如所有子視圖都傳回非,則hitTest:withEvent:方法傳回自身(self)。

2.fame,bounds,center,alpha,opaque,hidden

這些都是view的一些基本屬性。frame是描述該view在其父視圖中的一塊區域。其坐标系是在其父視圖中的坐标。我們在進行view的初始化時會經常使用到frame。bounds也是描述該view的大小,是其在自身的坐标系中的位置大小。center是描述其在父視圖的中心位置坐标。我們在進行view的位置改變而不改變view的大小的時,會使用center。alpha是用來描述改view的透明度從0到1,0表示的是透明,1表示不透明。alpha支援動畫(animation),alpha = 0 與 hidden = YES 效果一樣都是看不到view,但是後者相比開銷大。在alpha等于0時view接受touch事件,但是hidden則不接受。并且hidden和apaque 不支援動畫。alpha并不影響鑲嵌在其内部view行為,而hidden會影響。當把view設定為透明背景時,一般把opaque設定為NO,可以減少開銷,優化記憶體.opaque影響圖形繪制系統。設定為YES,會優化view的繪制。

3,nil,NSNULL,NULL差別

nil是指向obj-c中對象的空指針,是一個對象,在o-c中ni對象調用方法不會引起crash。

Nil是指向obj-c中的類的空指針,表示的是一個空類。

NULL是指向任何類型的空指針(如c/c++中的空指針),在objective-c中是一個數值。

NSNULL用于集合操作,在集合對象中,表示一個空值的集合對象。

4.KVC and KVO

KVC(key-value-coding)鍵值編碼,是一種間接操作對象屬性的一種機制,可以給屬性設定值。通過setValue:forKey:和valueForKey,實作對屬性的存取和通路。

KVO(key-value-observing)鍵值觀察,是一種使用觀察者模式來觀察屬性的變化以便通知注冊的觀察者。通過注冊observing對象addObserver:forKeyPath:options:context:和觀察者類必須重寫方法 

observeValueForKeyPath:ofObject:change:context:。常應用MVC模型中,資料庫(dataModal)發生變化時,引起view改變。

5.NSThread,NSOperation,GCD

NSThread,NSOperation,GCD是IOS中使用多線程的三種方式之一。他們各有優缺點。抽象層次是從低到高的,抽象度越高的使用越簡單。

NSThread,缺點:需要自己維護線程的生命周期和線程的同步和互斥,但是這些都需要耗費系統的資源。優點:比其它兩個更輕。

NSOperation,優點:不需要自己管理線程的生命周期和線程的同步和互斥等。隻是需要關注自己的業務邏輯處理,需要和NSOperationQueue一起使用。

GCD,是Apple開發的一個多核程式設計解決方法,優點:比前面兩者更高效更強大。

6.autorelease ,ARC 和非ARC

autorelease 自動釋放,與之相關聯的是一個自動釋放池(NSAutoReleasePool).autorelease的變量會被放入自動釋放池中。等到自動釋放池釋放時(drain)時,自動釋放池中的自動釋放變量會随之釋放。ios系統應用程式在建立是有一個預設的NSAutoReleasePool,程式退出時會被銷毀。但是對于每一個RunLoop,系統會隐含建立一個AutoReleasePool,所有的release pool會構成一個棧式結構,每一個RunLoop結束,目前棧頂的pool會被銷毀。

ARC,自動應用計數。(iOS 6加入)IOS記憶體管理是基于變量的應用計數的。這樣系統幫你管理變量的release,retain等操作。

非ARC,非自動應用計數。手動管理記憶體。自己負責系統變量的release,retain等操作。做到誰配置設定誰釋放,及alloc和release像對應。函數傳回對象時使用autorelease。

可以使用Xcode将非ARC轉化為ARC,ARC和非ARC混編。可在在編譯ARC時使用-fno-objc-arc,-fobjc-arc标簽。實際需要看工程是支援還是不支援ARC模式。

7.xib,storyboard,手動書寫代碼

xib(interface buider),友善對界面進行編輯。可以在視窗上面直接添加各種視圖,優點:直接看到界面的效果,操作簡單。缺點:不友善對視圖進行動态控制,不靈活。

手動編寫代碼,繼承(主要是UIView,UIViewController),優點:可以對視圖進行定制,靈活控制友善。缺點:不能馬上看到效果,複雜。

storyboard(故事闆在ios6加入)。優點:可以看到界面效果,能同時進行多個界面的互動,高效快速。缺點:不能進行進行界面的定制,卻笑靈活性。

xib和storyboard主要用于界面中的元素位置固定和清楚裡面有哪些元素。但是如果需要動态變化界面還是手動編寫代碼比較好。一般還是各種方式混合使用。

8.loadView,viewDidLoad,ViewDidUnload,viewWillAppear,viewDidAppear,viewwilldDisappear,viewDidDisappear

當view的nib檔案為nil時,手動建立界面時調用loadView,當view的nib檔案存在時,會在viewDidLoad中實作。但是當你的程式運作期間記憶體不足時,視圖控制器收到didReceiveMemoryWarning時,系統會檢查目前的視圖控制器的view是否還在使用,如果不在,這個view會被release,再次調用loadView來建立一個新的View。viewDidLoad ,不論是從xib中加載視圖,還是從loadview生成視圖,都會被調用。但是如果改view在棧中下一次顯示是不會被調用。ViewWillAppear,ViewDidAppear會在view每次即将可見和完全顯示時都會調用。我們會在ViewWillAppear裡面進行一些view顯示的準備工作,ViewDidDi sappear 和ViewWillDisAppear時會在view每次消失時都會調用。當系統收到didReceiveMemoryWarning通知時顯示記憶體不足時,會調用ViewDidUnload來清理View中的資料和release後置為nil。

9,copy 和retain差別

retain,相當于指針拷貝。變量的引用計數加一。另外一個指針也指向改位址。

copy,相當于内容拷貝。變量的引用計數加一。但是自己本身計數不變。開辟另外一個位址空間放入相同變量的值進去。

10,手動寫setter和getter方法

- (void) setOldValue: (NSString*) newValue {

    if (newValue !=oldValue) {

        [oldValue release];

        oldValue = [newValue retain];

    }

}

11,NSRunLoop 和NSOperationQueue

NSRunLoop 是所有要監視的輸入源和定時源以及要通知的注冊觀察者的集合.用來處理諸如滑鼠,鍵盤事件等的輸入源。每一個線程擁有自己的RunLoop有系統自動建立。你不應該自己去建立,隻能擷取。一般不會用NSRunLoop,因為它不是線程安全的。一般都用CFRunLoop,這個是線程安全的,是一種消息處理模式,我們一般不用進行處理。

NSOperationQueue時一個管理NSOperation的隊列。我們會把NSOperation放入queue中進行管理。

12,IOS常用的設計模式

單例模式,DeafutCenter,Deafultqueue等

MVC模式,View,model,ViewController。

觀察者模式,通知,KVO

工廠模式,

代理模式,delegate

13.記憶體管理和優化

原則:

1.1    誰建立,誰釋放(類似于“誰污染,誰治理”)。如果你通過alloc、new或copy來建立一個對象,那麼你必須調用release或autorelease。換句話說,不是你建立的,就不用你去釋放。

例如,你在一個函數中alloc生成了一個對象,且這個對象隻在這個函數中被使用,那麼你必須在這個函數中調用release或autorelease。如果你在一個class的某個方法中alloc一個成員對象,且沒有調用autorelease,那麼你需要在這個類的dealloc方法中調用release;如果調用了autorelease,那麼在dealloc方法中什麼都不需要做。

1.2  除了alloc、new或copy之外的方法建立的對象都被聲明了autorelease。

1.3  誰retain,誰release。隻要你調用了retain,無論這個對象是如何生成的,你都要調用release。有時候你的代碼中明明沒有retain,可是系統會在預設實作中加入retain。

優化:

在收到記憶體didReceiveMemoryWarning的警告時,釋放掉一些不再需要的資源,注意編碼規範,如一些變量不使用需要及時的釋放。避免是占用太多的記憶體空間,有時需要用空間去換取時間,盡量使用一些高效的算法和資料結構節約記憶體空間。最後使用一些記憶體檢測工具和代碼的靜态分析查找記憶體洩漏和配置設定(instrument,leaks,allocations)。

14,tableview的優化

1.1 正确的複用cell。

1.2 減少在傳回每個cell裡面的處理邏輯和處理時間。盡量将資料進行緩存和複用。

1.3,盡量減少處理加載和計算的時間,不阻塞UI線程。

1.4,盡量使用繪制每個cell。

1.5,設定每個cell的opaque屬性。

1.6,盡量傳回每行固定的height。

1.7,在每個cell減少圖形效果。

1.8,分段加載資料。

15,opengl,quatarz 2d

上面2種方式是進行圖形繪制會使用到的技術。

quatarz 2d 是Apple提供的基于Core graphic的繪制基本圖形工具庫。操作簡單友善,能夠滿足大部分需要。隻是适用于2D圖形的繪制。

opengl,是一個跨平台的圖形開發庫。适用于2D和3D圖形的繪制。功能強大但是複雜。

16, animation

IOS提供豐富的Core Animation動畫滿足使用者的需要,主要實作方式如下3種:

1.1  commitAnimations方式使用UIView動畫

UIView Animations 動畫: 

[UIView beginAnimations:@"animationID" context:nil]; 

[UIView setAnimationDuration:0.5f]; 

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

[UIView setAnimationRepeatAutoreverses:NO]; 

//以下四種效果 

/* 

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];//oglFlip, fromLeft 

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];//oglFlip, fromRight  

[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 

[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; 

*/ 

//你自己的操作

[UIView commitAnimations];

1.2、CATransition

    CATransition *animation = [CATransitionanimation];

    animation.duration = 0.5f;

    animation.timingFunction =UIViewAnimationCurveEaseInOut;

    animation.fillMode = kCAFillModeForwards;

    animation.type = kCATransitionMoveIn;

    animation.subtype = kCATransitionFromTop;

    [self.window.layeraddAnimation:animationforKey:@"animation"];

   //自己的操作

1.3、UIView animateWithDuration

方法: +(void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations; 

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; //多一個動畫結束後可以執行的操作. 

[UIView animateWithDuration:1.25 animations:^{ 

CGAffineTransform newTransform = CGAffineTransformMakeScale(1.2, 1.2); 

[firstImageView setTransform:newTransform]; 

[secondImageView setTransform:newTransform];} 

completion:^(BOOL finished){ 

[UIView animateWithDuration:1.2 animations:^{ 

//自己的操作} completion:^(BOOL finished){ 自己的操作}]; 

}];

17,定制化view 

需要自己自己繼承自cocoa touch提供的豐富的類。如(UIView,UiScrollView,UITableView等等)。需要重載實作drawRect,touch事件,init,initFrame等方法。

18.core Data,sqlite,file,NSUserDefaults

上面四種是IOS中資料存取的方式。

Core Data,sqlite涉及到資料庫。sqlite需要通過sqlite語句操作資料庫,而core data是Apple提供的一個基于sqlite更抽象成對象的一種對資料庫操作方式。

file,主要是把資料存儲在磁盤中。通過寫和讀檔案操作。

NSUserDefaults,主要是存儲應用程式中的一些輕量級資料如應用程式的設定和屬性和使用者資訊等。

19.機型和尺寸的适配

Iphone 的主要尺寸是3.5和4英寸。分辨率為:320*480,480*960(retina)。

IPad 主要尺寸是7.9和9.7英寸。分辨率為:1024*768,2048*1536(retina)。

20.添加手勢的方式(gesture和touches事件)

1.自己重載實作touchMoved,touchBegin,touchEnd,touchCanceled事件。

2.通過UIGestureRecongnizer添加AddGestureRecognier事件。該方式友善添加一些諸如點選,輕按兩下,拖動等基本的手勢事件。

21.應用程式的生命周期和狀态(參照:javascript:void(0))

Not running  未運作  程式沒啟動

Inactive          未激活        程式在前台運作,不過沒有接收到事件。在沒有事件處理情況下程式通常停留在這個狀态

Active             激活           程式在前台運作而且接收到了事件。這也是前台的一個正常的模式

Backgroud     背景           程式在背景而且能執行代碼,大多數程式進入這個狀态後會在在這個狀态上停留一會。時間到之後會進入挂起狀态(Suspended)。有的程式經過特殊的請求後可以長期處于Backgroud狀态

Suspended    挂起           程式在背景不能執行代碼。系統會自動把程式變成這個狀态而且不會發出通知。當挂起時,程式還是停留在記憶體中的,當系統記憶體低時,系統就把挂起的程式清除掉,為前台程式提供更多的記憶體。

下圖是程式狀态變化圖:

iOS 必備技術點

各個程式運作狀态時代理的回調:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

      告訴代理程序啟動但還沒進入狀态儲存

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

     告訴代理啟動基本完成程式準備開始運作

- (void)applicationWillResignActive:(UIApplication *)application

    當應用程式将要入非活動狀态執行,在此期間,應用程式不接收消息或事件,比如來電話了

- (void)applicationDidBecomeActive:(UIApplication *)application 

     當應用程式入活動狀态執行,這個剛好跟上面那個方法相反

- (void)applicationDidEnterBackground:(UIApplication *)application

    當程式被推送到背景的時候調用。是以要設定背景繼續運作,則在這個函數裡面設定即可

- (void)applicationWillEnterForeground:(UIApplication *)application

當程式從背景将要重新回到前台時候調用,這個剛好跟上面的那個方法相反。

- (void)applicationWillTerminate:(UIApplication *)application

當程式将要退出是被調用,通常是用來儲存資料和一些退出前的清理工作。這個需要要設定UIApplicationExitsOnSuspend的鍵值。

- (void)applicationDidFinishLaunching:(UIApplication*)application

當程式載入後執行

加載應用程式進入前台

iOS 必備技術點
iOS 必備技術點
iOS 必備技術點

加載應用程式進入背景

iOS 必備技術點
iOS 必備技術點
iOS 必備技術點

22.block程式設計

Block 是一種具有匿名功能的内嵌函數塊。Block 一般是用來表示、簡化一小段的程式碼,它特别适合用來建立一些同步執行的程式片段、封裝一些小型的工作或是用來做為某一個工作完成時的回傳呼叫(callback) 。格式如下:^(傳入參數列) {行為主體};

23.常用的開源架構

網絡架構:ASIHttpRequest,AFNetworking,coocaHttpServer等。

進度條:SVprogressHUD,MBprogressHUD,

工具類:SSToolKit等。

分享類:ShareKit等

日志架構:log4j,cocoa lumberJack 等。

等等。

24.通知消息和代理的差別

通知:分為本地和遠端通知。接受通知的接受者需要進行注冊改通知。這樣通知被NSNotificationCenter發送出來後會被注冊的接受者所接受。遠端通知需要借助蘋果的伺服器去實作通知的中轉。

代理:把某個對象要做的事情委托給别的對象去做。

兩者差別:

delegate針對one-to-one關系,用于sender接受到reciever的某個功能回報值。

notification針對one-to-one/many/none,reciver,用于通知多個object某個事件,sender隻是負責把notification發送出去。

25.資料解析(json和XML)

json資料的解析通常借助一些開源的架構如:SBJson,TouchJson,jsonKit,Apple 提供的原生的JSon解析 NSJSON Serialization等。去json資料轉化為IOS中常用的字典等。

XML資料的解析。xml分為SAX和DOM兩種解析方式。

DOM解析XML時,讀入整個XML文檔并建構一個駐留記憶體的樹結構(節點樹),通過周遊樹結構可以檢索任意XML節點,讀取它的屬性和值。而且通常情況下,可以借助XPath,直接查詢XML節點。

SAX解析XML,是基于事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個文檔加載完之後才采取操作,當在讀取解析過程中遇到需要處理的對象,會發出通知對其進行處理。

一般在iOS平台下,比較常用的XML解析類庫有如下幾種:

NSXMLParser,,這是一個SAX方式解析XML的類庫,預設包含在iOS SDK中,使用也比較簡單。

libxml2,是一套預設包含在iOS SDK中的開源類庫,它是基于C語言的API,是以使用起來可能不如NSXML友善。這套類庫同時支援DOM和SAX解析,libxml2的SAX解析方式還是非常酷的,因為它可以邊讀取邊解析,尤其是在從網上下載下傳一個很大的XML檔案,就可以一邊下載下傳一邊對已經下載下傳好的内容進行解析,極大的提高解析效率。

TBXML,這是一套輕量級的DOM方式的XML解析類庫,有很好的性能和低記憶體占用,不過它不對XML格式進行校驗,不支援XPath,并且隻支援解析,不支援對XML進行修改。

TouchXML,這也是一套DOM方式的XML解析類庫,支援XPath,不支援XML的修改。

KissXML,這是一套基于TouchXML的XML解析類庫,和TouchXML相比,支援了XML的修改。

TinyXML,這是一套小巧的基于C語言的DOM方式進行XML解析的類庫,支援對XML的讀取和修改,不直接支援XPath,需要借助另一個相關的類庫TinyXPath才可以支援XPath。

GDataXML,這是一套Google開發的DOM方式XML解析類庫,支援讀取和修改XML文檔,支援XPath方式查詢。

26.webservice

Web service是一個平台獨立的,松耦合的,自包含的、基于可程式設計的web的應用程式,可使用開放的XML标準來描述、釋出、發現、協調和配置這些應用程式,用于開發分布式的互操作的應用程式。技術支援包含如下:

1.1 xml 和xsd

1.2 Soap

1.3wsdl

1.4 uddi

1.5調用RPC和消息傳遞

27.開發App的步驟,開發者賬号,釋出app到appstore

  證書分兩種:開發者證書、釋出者證書。前者開發時使用,後者釋出使用 

(1) 模拟器調試無需代碼簽名;真機調試需開發者證書代碼簽名;釋出時需釋出證書簽名 

(2) 代碼簽名需要:證書+私鑰,

(3) 真機調試時要求在裝置上安裝描述檔案(provision profile),該檔案包含資訊:調試者證書,

授權調試裝置清單,應用ID。一個應用對應一個描述檔案。

28.類繼承,類的擴充(extension),類别(category)

category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,隻能添加,不能删除修改。

并且如果類别和原來類中的方法産生名稱沖突,則類别将覆寫原來的方法,因為類别具有更高的優先級。

類别主要有3個作用:

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

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

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

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

category和extensions的不同在于後者可以添加屬性。另外後者添加的方法是必須要實作的。

extensions可以認為是一個私有的Category。

29.CAlayer介紹

一個UIView包含CALayer樹,CALayer是一個資料模型。包含了一些用來顯示的對象,在UIView的子類中都可以找到層這個元件,層是位于固定的畫布上的一個子片,可以被覆寫。層是彼此堆疊在一起的最終産生一個界面。除此之層可以包含多個層,通過層可以操作位于此層上面的其他内容,例如旋轉,動畫,翻頁等。

30.ios 怎麼實作多繼承

IOS通過實作protocol委托代理,實作多個接口來實作多繼承。

31.app性能測試方式

通過Xcode提供的工具如Instrument,測試CPU,Mermory性能。也可以适用一些開源的自動化測試工具:如Frank,KIF等。

32.NSArray可以放基本資料類型不(int,float,nil)怎麼放進一個結構體

NSArray 隻能存放objective-c對象資料模型,這些基本資料類型需要先轉化為NSNumber對象再存放進數組中。

33.objective-c和c,c++混合編寫

在 Objective-C++中,可以用C++代碼調用方法也可以從Objective-C調用方法。在這兩種語言裡對象都是指針,可以在任何地方使用。例 如,C++類可以使用Objective-C對象的指針作為資料成員,Objective-C類也可以有C++對象指針做執行個體變量。Xcode需要源檔案以".mm"為擴充名,這樣才能啟動編譯器的Objective-C++擴充。

34.常見的語言編碼(utf-8,unicode,gb2312,gbk)

常見的語言編碼有:

GB2312:簡體中文編碼,一個漢字占用2位元組,在大陸是主要編碼方式。

BIG5:繁體中文編碼。主要在台灣地區采用。 

GBK:支援簡體及繁體中文,但對他國非拉丁字母語言還是有問題。 

UTF-8:Unicode編碼的一種。Unicode用一些基本的保留字元制定了三套編碼方式,它們分别UTF-8,UTF-16和UTF-32。在UTF-8中,字元是以8位序列來編碼的,用一個或幾個位元組來表示一個字元。這種方式的最大好處,是UTF-8保留了ASCII字元的編碼做為它的一部分。UTF-8俗稱“萬國碼”,可以同屏顯示多語種,一個漢字占用3位元組。為了做到國際化,網頁應盡可能采用UTF-8編碼。

當然,進行中文時http頭也要改成UTF-8編碼的-----加上<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。

語言                             字元集                                正式名稱

英語、西歐語                ASCII,ISO-8859-1        MBCS多位元組

簡體中文                      GB2312                          MBCS多位元組

繁體中文                      BIG5                               MBCS多位元組

簡繁中文                      GBK                                MBCS多位元組

中文、日文及北韓語       GB18030                        MBCS多位元組

各國語言                      UNICODE,UCS              DBCS寬位元組

35.常見的加解密方式(rsa,aes,md5)

常見的加解密方式有:

RSA:基于公鑰和私鑰的非對程加密算法。适用範圍廣。

AES:是一種對程加密的流行方式。加密涉及矩陣運算。

MD5:将任意長度的“位元組串”變換成一個128bit的大整數,并且它是一個不可逆的字元串變換算法,

36.objective-c語言的優缺點

objc優點:

1) Cateogies

2) Posing

3) 動态識别

4) 名額計算

5)彈性訊息傳遞

6) 不是一個過度複雜的 C 衍生語言

7) Objective-C 與 C++ 可混合程式設計

缺點:

1) 不支援命名空間

2)  不支援運算符重載

3) 不支援多重繼承

4) 使用動态運作時類型,所有的方法都是函數調用,是以很多編譯時優化方法都用不到。(如内聯函數等),性能低劣。

37,ios應用的調試技巧

1.如遇到crash,分析崩潰日志(symbolicatedrash工具的适用)保留崩潰版本的.dSYM檔案

2.在 XCode 中進入斷點管理視窗;然後點選右下方的 +,增加新的 Exception Breakpoint。

3.如遇到EXC_BAD_ACCESS,打開Scheme選項選擇EditScheme。然後按圖勾上Enable Zombie Objects和Malloc Stack那兩項。

4.有效的日志管理。NSLog和加入一些開源的日志管理架構。

5.程式斷點debug模式。

38,應用程式性能的調優(轉http://www.open-open.com/lib/view/open1365861753734.html)

1. 用ARC去管理記憶體(Use ARC to Manage Memory)

   2.适當的地方使用reuseIdentifier(Use a reuseIdentifier Where Appropriate)

   3.盡可能設定視圖為不透明(Set View as Opaque When Possible)

   4.避免臃腫的XIBs檔案(Avoid Fat XiBs)

   5.不要阻塞主程序(Don't Block the Main Thread)

   6.調整圖像視圖中的圖像尺寸(Size Images to Image Views)

   7.選擇正确集合(Choose the Correct Collection)

   8.啟用Gzip壓縮(Enable GZIP Compression)

    9. 重用和延遲加載視圖(Reuse and Lazy Load Views)

   10.緩存,緩存,緩存(Cache,Cache,Cache)

   11.考慮繪圖(Consider Drawing)

   12.處理記憶體警告(Handle Memory Warnings)

   13.重用大開銷對象(Reuse Expensive Objects)

   14.使用精靈表(Use Sprite Sheets )

   15.避免重複處理資料(Avoid Re-Processing Data)

   16.選擇正确的資料格式(Choose the Right Data Format)

   17.适當的設定背景圖檔(Set  Background Images Appropriately)

   18.減少你的網絡占用(Reduce Your Web Footprint)  

   19.設定陰影路徑(Set the Shadow Path )

   20.你的表格視圖Optimize Your Table Views)

   21.選擇正确的資料存儲方式(Choose Correct Data Storage Option)

   22.加速啟動時間(Speed up Launch Time )

   23.使用自動釋放池(Use AutoRelease Pool)

   24.緩存圖像(Cache Images-Or not )

   25.盡可能避免日期格式化器(Avoid Date Formatters Where Possible)

39.UIScrollView 的contentSize、contentOffSet和contentInset屬性的差別

contentSize表示UIScrollView滾動區域的大小。UIScrollView的frame屬性在設定好了以後不會随内容的變化而變化。

contentOffSet表示是UIScrollView目前顯示區域頂點相對于frame頂點的偏移量,一般用來設定UIScrollView顯示的位置。

contentInset表示是scrollview的contentView的頂點相對于scrollview的位置,假設你的contentInset = (0 ,100),那麼你的contentView就是從scrollview的(0 ,100)開始顯示。一般都是(0,0)表示從scrollView的開始顯示。