1. 程式人生 > >關於iOS程式設計師面試的技巧

關於iOS程式設計師面試的技巧

我是一名程式設計師,做iOS軟體開發,公司究竟需要一個怎樣的iOS開發人員,面試的時候究竟會主要問哪些問題,今天做個小小的總結,希望能夠幫助到大家。這些也都是在網站檢視資料做的總結,有些並非原創,但是確實有很多的知識點值得大家去學習(都是為了學習)

1、自動釋放池是什麼,如何工作?

當您向一個物件傳送一個autorelease訊息時,Cocoa就會將該物件的一個引用放入到最新的自動釋放池。

它仍然是個正當的物件,因此自動釋放 池定義的作用域內的其它物件可以向它傳送訊息。

當程式執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有物件也就被釋放。 

 2、說一說static 關鍵字

(1)函式體內 static 變數的作用範圍為該函式體,不同於 auto 變數,該變數的記憶體只被分配一次, 

因此其值在下次呼叫時仍維持上次的值; 

(2)在模組內的 static 全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問; 

(3)在模組內的 static 函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告 

它的模組內; 

(4)在類中的 static 成員變數屬於整個類所擁有,對類的所有物件只有一份拷貝; 

(5)在類中的 static 成員函式屬於整個類所擁有,這個函式不接收 this 指標,因而只能訪問類的static 成員變數。  

 3、什麼事單件例項

Foundation 和 Application Kit 框架中的一些類只允許建立單件物件,即這些類在當前程序中的唯一例項。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基於程序進行單件物件的例項化。當向這些類請求例項的時候,它們會向您傳遞單一例項的一個引用,如果該例項還不存在,則首先進行例項的分配 和初始化。單件物件充當控制中心的角色,負責指引或協調類的各種服務。如果類在概念上只有一個例項(比如 

NSWorkspace),就應該產生一個單件例項,而不是多個例項;如果將來某一天可能有多個例項,您可 

以使用單件例項機制,而不是工廠方法或函式。

 4、說說Objective-C,有哪些優點哪些不足

objc優點: 

1) Cateogies 

2) Posing 

3) 動態識別 

4) 指標計算 

5)彈性訊息傳遞 

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

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

不足: 

1) 不支援名稱空間 

2)  不支援運算子過載 

3)不支援多重繼承 

4)使用動態執行時型別,所有的方法都是函式呼叫,所以很多編譯時優化方法都用不到。(如行內函數等),效能低劣。 

5、#import和#include的區別,@class代表什麼?

@class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到,在m檔案中還是需要使用#import

而#import比起#include的好處就是不會引起重複包含

 6、執行緒和程序的區別?

程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。

程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個 程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式 健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

7、Object-C的記憶體管理?

1.當你使用new,alloc和copy方法建立一個物件時,該物件的保留計數器值為1.當你不再使用該物件時,你要負責向該物件傳送一條release或autorelease訊息.這樣,該物件將在使用壽命結束時被銷燬.

2.當你通過任何其他方法獲得一個物件時,則假設該物件的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確保該物件被清理.如果你打算在一段時間內擁有該物件,則需要保留它並確保在操作完成時釋放它.

3.如果你保留了某個物件,你需要(最終)釋放或自動釋放該物件.必須保持retain方法和release方法的使用次數相等.

8、屬性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

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    誰建立,誰釋放(類似於“誰汙染,誰治理”)。如果你通過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事件。該方式方便新增一些諸如點選,雙擊,拖動等基本的手勢事件。

Not running  未執行  程式沒啟動

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

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

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

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

下圖是程式狀態變化圖:

bubuko.com,布布扣

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

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

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的開始顯示。

40.IOS6 AutoLayout

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


相關推薦

關於iOS程式設計師面試技巧

我是一名程式設計師,做iOS軟體開發,公司究竟需要一個怎樣的iOS開發人員,面試的時候究竟會主要問哪些問題,今天做個小小的總結,希望能夠幫助到大家。這些也都是在網站檢視資料做的總結,有些並非原創,但是確實有很多的知識點值得大家去學習(都是為了學習) 1、自動釋放池是什麼

Java 程式設計師面試技巧

  對於每一個求職者,有一份優秀的簡歷是很必要的,企業通過簡歷的篩選,會給予求職者面試的機會。然而,很多求職者就是在面試過程中與鍾情的工作失之交臂。如何在面試中取得成功呢?“細節決定成敗” ,有很多求職者有很強的專業技術,因為在面試過程中忽略了一些細節,從而失去了一次工作機

學會這些程式設計師面試技巧面試不過來打我!

假如去面試要問10個問題,那麼至少5個問題會根據你所介紹的專案背景來問。 面試時7份靠能力,3份靠技能,而剛開始時的介紹專案又是技能中的重中之重,決定一次面試的成敗,那麼面試時如果介紹自己的專案呢? 1、在面試前準備專案描述 別害怕,因為面試官什麼都不知道,面試官是人,不是神,拿到

程式設計師面試有哪些小竅門?最接地氣的程式設計師面試面試技巧總結

先來看看:    https://mobile.yangkeduo.com/mall_page.html?mall_id=129221094 因為程式設計師基本都是頭腦程式化,不太會察言觀色,也就是情商不是很高,我就是屬於那種!~~今天我們要講的並不是諸如php面試

iOS程式設計師這樣面試,當場拿到offer的機率是80%

前言: 希望通過本文大家可以對面試這件事的整體和細節有更進一步的認知,參加面試也能更加自信和有把握。逐漸成長為可以縱橫江湖的麵霸,進入大廠,走向人生巔峰,迎娶白富美!在江湖上留下你的傳說。 面試,難還是不難?取決於面試者的底蘊(氣場+技能)、心態和認知及溝通技巧。面試其實

技術好卻進不了大公司?程式設計師面試的幾個小技巧請收好

有很多程式設計師,專業技術挺好,專案經驗充足,簡歷上金碧輝煌,也面試了很多國內大廠,但就是沒有一家能成功的。處境可以說是相當尷尬。 大家都知道程式設計師本身就是要吃年輕飯,不僅是技術活,也是體力活。早點跳槽,早點漲薪,就顯得格外的重要了。 那麼我就給大家分享一下程式設計師面試的幾個小技巧: 1.面試準備要

程式設計師面試寶典隨筆記(一)-----TCPIP和socket程式設計面試技巧

****能進行網路程式設計***** 1.如果你說你會select,epoll,iocp模型,那會讓對方覺得更靠譜 2.如果你說出你做過im,下載之類那會讓對方來興趣. 3.如果你說設計了通訊協議

跳槽必看,Java程式設計師面試中你需要注重的技巧

面試是件既簡單又複雜的事情,也正是因為簡單和複雜的兩面性,所以我們在面試的時候要多學些面試技巧,如果你說掌握這些東西也沒什麼鳥用,那我是無話可說了;如果你覺得各方面都準備妥當,但差點火候,我覺得你看完這篇能更好的發揮你的潛力。 一、簡歷製作 在寫簡歷

程式設計師面試筆試經驗技巧

本文為博主年初準備找工作時,在讀完《Java面試筆試寶典》這本書後,加上自身的經歷總結的面經。主要受眾為在校應屆畢業生、剛畢業不舊的小白、想要轉行做開發的小小白,請大神們一笑而過。 希望能對想要找工作的程式設計師們一定啟發。 ==========

[C/C++程式設計師面試寶典] (07)-翻轉句子中單詞的順序

點選此處檢視原文 題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。 例如輸入“I am a student.”,則輸出“student. a am I”。 分析:由於編寫字串相關程式碼能夠反映程式設計師

程式設計師面試寶典(12)-從上往下遍歷二元樹

http://www.itmian4.com/thread-6009-1-1.html 題目:輸入一顆二元樹,從上往下按層列印樹的每個結點,同一層中按照從左往右的順序列印。 例如輸入          &n

程式設計師面試寶典筆記(歐立奇版)

printf()函式計算引數是從右向左入棧的。 *(ptr++)+=123;含義為*ptr=*ptr+123;ptr++;//括號的優先順序比*低 float a=1.0f; cout<<(int&)a<<endl; //浮點數在記憶體裡和整數的儲存方式不同

程式設計師面試掌握這些,進入BAT不是夢!

首先,五年左右,應該算高階開發工程師,大部分面試不用去做題,背string和stringbuilder區別的,幾乎都是底層和遠離,分散式等。雖然一個程式設計師,在工作中大部分還是寫流水程式碼,增刪查改。 1 JVM 這個大公司基本都會問,記憶體模型,GC,jvm都有哪些區域?棧楨存了什

Java高階程式設計師面試題目集

  時隔兩年,再一次的面臨離職找工作,這一次換工作有些許的不捨,也有些許的無奈。個人所在的技術團隊不錯,兩年時間成長了很多,也很不捨這個團隊。但是,由於公司的某些原因和對於自身未來發展的綜合考慮,又不得不得離去,去尋找更合適的地方成長和發展。相比於兩年前,

程式設計師面試時候出的一些邏輯問題

第1章數學趣題解析 1.酒水分裝問題 某人有12品脫啤酒一瓶(品脫是英容量單位,1品脫=0.568升),想從中倒出6品脫。但是他沒有6品脫的容器,只有一個8品脫的容器和一個5品脫的容器。怎樣的倒法才能使8品脫的容器中恰好裝入6品脫啤酒?  分析與解答 這個數學遊戲有兩種不同的解法,

程式設計師面試,如何保證拿到offer的機率是80%以上?

  一、概述 面試,難還是不難?取決於面試者的底蘊(氣場+技能)、心態和認知及溝通技巧。面試其實可以理解為一場聊天和談判,在這過程中有心理、思想上的碰撞和博弈。其實你只需要搞清楚一個邏輯:“面試官為什麼會這樣問?他希望聽到什麼答案?”然後針對性的準備和回答就行了,無他。 “你的優勢是什麼?

【讀書筆記】程式設計師面試筆記

第二部分 面試筆試技術篇 第10章 C++程式設計基礎 (2018年11月6日閱讀) 10.1 程式的編譯和執行 小結: 【面試題1】 【面試題2】 【面試題3】 10.2 變數 小結: 【面試題1】 【面試題2】 【面試題3】 10.3 條件語句和迴圈語句 小結: 【面試題1】

程式設計師面試寶典隨筆記(一)----計算機網路知識點梳理

傳輸層概 作用:傳輸層為它上面的應用層提供通訊服務。 在OSI七層參考模型中,傳輸層是面向通訊的最高層,也是使用者功能的最底層。 傳輸層兩大重要的功能:複用 和 分用。 複用:在傳送端,多個應

程式設計師面試寶典隨筆記(一)--記憶體管理詳解

  記憶體管理是C++最令人切齒痛恨的問題,也是C++最有爭議的問題,C++高手從中獲得了更好的效能,更大的自由,C++菜鳥的收穫則是一遍一遍的檢查程式碼和對C++的痛恨,但記憶體管理在C++中無處不在,記憶體洩漏幾乎在每個C++程式中都會發生,因此要想成為C++高手,記

程式設計師面試寶典隨筆記(一)---執行緒和程序1,-基礎資訊

①程式,程序,執行緒的區別 程式:程式是由一系列的指令和邏輯組成的一個靜態檔案(如cpp檔案),無論能不能執行,它都客觀的存在於儲存器中。 程序:程序是計算機中的程式關於某資料集合