iOS 常見面試題

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

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) {

        [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    誰創建,誰釋放(類似於“誰污染,誰治理”)。如果你通過allocnewcopy來創建一個對象,那麼你必須調用releaseautorelease。換句話說,不是你創建的,就不用你去釋放。
例如,你在一個函數中alloc生成了一個對象,且這個對象只在這個函數中被使用,那麼你必須在這個函數中調用releaseautorelease。如果你在一個class的某個方法中alloc一個成員對象,且沒有調用autorelease,那麼你需要在這個類的dealloc方法中調用release;如果調用了autorelease,那麼在dealloc方法中什麼都不需要做。

1.2  除了allocnewcopy之外的方法創建的對象都被聲明瞭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.應用程序的生命週期和狀態(參照:http://blog.csdn.net/totogo2010/article/details/8048652

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)
向對象添加非正式協議。
 
繼承可以增加,修改或者刪除方法,並且可以增加屬性。

categoryextensions的不同在於後者可以添加屬性。另外後者添加的方法是必須要實現的。
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-16UTF-32。在UTF8中,字符是以8位序列來編碼的,用一個或幾個字節來表示一個字符。這種方式的最大好處,是UTF8保留了ASCII字符的編碼做爲它的一部分。UTF-8俗稱萬國碼,可以同屏顯示多語種,一個漢字佔用3字節。爲了做到國際化,網頁應儘可能採用UTF-8編碼。

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

語言                             字符集                                正式名稱

英語、西歐語                ASCIIISO-8859-1        MBCS多字節

簡體中文                      GB2312                          MBCS多字節

繁體中文                      BIG5                               MBCS多字節

簡繁中文                      GBK                                MBCS多字節

中文、日文及朝鮮語       GB18030                        MBCS多字節

各國語言                      UNICODEUCS              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.適當的地方使用reuseIdentifierUse 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的開始顯示。


40.IOS6 AutoLayout

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章