IOS面試經常被問到的問題

Geek.發表於2019-04-25

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

事件的響應(responder chain)

只有繼承了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) {

[oldValuerelease];

oldValue = [newValueretain];

}
複製程式碼

}

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英寸。解析度為:320480,480960(retina)。

IPad 主要尺寸是7.9和9.7英寸。解析度為:1024768,20481536(retina)。

20.新增手勢的方式(gesture和touches事件)

1.自己過載實現touchMoved,touchBegin,touchEnd,touchCanceled事件。

2.通過UIGestureRecongnizer新增AddGestureRecognier事件。該方式方便新增一些諸如點選,雙擊,拖動等基本的手勢事件。

21.應用程式的生命週期和狀態(參照:blog.csdn.net/totogo2010/…

Not running 未執行 程式沒啟動

Inactive 未啟用 程式在前臺執行,不過沒有接收到事件。在沒有事件處理情況下程式通常停留在這個狀態

Active 啟用 程式在前臺執行而且接收到了事件。這也是前臺的一個正常的模式

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

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

下圖是程式狀態變化圖:

各個程式執行狀態時代理的回撥:

  • (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

當程式載入後執行

載入應用程式進入前臺

載入應用程式進入後臺

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編碼的-----加上。

語言字符集正式名稱

英語、西歐語 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)彈性訊息傳遞

  1. 不是一個過度複雜的 C 衍生語言

  2. 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)

    1. 重用和延遲載入檢視(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的開始顯示。

40.IOS6 AutoLayout

AutoLayout是IOS6之後引進的自動佈局功能,有點型別有android的相對佈局屬性。通過勾選AutoLayout設定各種Constraint約束來實現在不同裝置和不同方向上的自動佈局。autosizing mask也就是 “springs and struts” 模式。autosizing mask決定了一個view會發生什麼當它的superview 改變大小的時候。而autolayout 不僅可以設定superview改變時view所做的變化,還支援當相鄰view變化時自己所做的變化。

41.假設有一個字串aabcad,請寫一段程式,去掉字串中不相鄰的重複字串,即上述字串處理之後的輸出結果為:aabcd

NSMutableString * str1 = [[NSMutableString alloc] initWithFormat:@"aabcad"];

for (int i = 0; i < str1.length - 1; i++)

{ for (int j = i + 1; j < str1.length ; j++)

{ // 由於字元的特殊性 無法使用 字串 isEqualToString 進行比較 只能轉化為ASCII 值進行比較 所以 需要加 unsigined 修飾

unsigned char a = [str1 characterAtIndex:i];

unsigned char b = [str1 characterAtIndex:j];

if (a == b)

{ if (j - i > 1)

{

// NSRange: 擷取字串 {j, 1} j: 第一個字元開始 1: 擷取幾個字元

NSRange range = {j, 1};

[str1 deleteCharactersInRange:range];

j = i--;

}

}

}

} NSLog(@"------ %@-------", str1);

本文為第三方轉載,原文連結:blog.csdn.net/u010500895/…

文章若有不對地方,歡迎批評指正,一個小而有用QQ交流群:805558511

相關文章