IOS面試常常被問到的問題

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

事件的響應(responder chain)android

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

事件分發(Event Delivery)c++

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

UIWindow對象以消息的形式將事件發送給第一響應者,使其有機會首先處理事件。若是第一響應者沒有進行處理,系統就將事件(經過消息)傳遞給響應者鏈中的下一個響應者,看看它是否能夠進行處理。objective-c

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。spring

hitTest:withEvent:方法的處理流程以下sql

:數據庫

首先調用當前視圖的

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.二、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.三、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

相關文章
相關標籤/搜索