面試題,以及答案

1,NSInterger 與int的區別。php

會根據系統不一樣來指定int的長度html

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64ios

typedef long NSInteger;git

typedef unsigned long NSUInteger;github

#elseobjective-c

typedef int NSInteger;算法

typedef unsigned int NSUInteger;編程

#endif設計模式

1,線程,有幾建立方法,沒種建立方法各有什麼區別。若是我要幾個竄行的線程怎麼建立,還有並行的怎麼建立。
數組

線程優先級怎麼定義。有哪幾種優先級。

 2,iOS平臺有些什麼事件。

答:重力加速度事件,搖動事件,指南針事件,touch事件。

 3,iOS touch 事件的原理,以及是怎麼再view 中傳遞的。



  • iOS的事件分發

  • 2014-01-26     我來講兩句    來源:sakulafly的專欄  

  • 收藏    我要投稿

  • 移動平臺上的開發主要關注數據以及數據的處理,事件的處理以及UI。因此事件的分發處理是很重要的一個環節,對於一個平臺的優劣來講也是一項重要的參數。若是事件的分發設計的很差,一些複雜的UI場景就會變得很難寫甚至無法寫。從小屏沒有觸摸的功能機開始到如今大屏多點觸摸的智能機,對於事件的分發處理基本思路都是同樣的——鏈(設計模式中有個模式就是職責鏈chain of responsibility),只是斷定的複雜程度不一樣。

    iOS中的事件有3類,觸摸事件(單點,多點,手勢)、傳感器事件(加速度傳感器)和遠程控制事件,這裏我介紹的是第一種事件的分發處理。

    \

    上面的這張圖來自蘋果的官方。描述了Responder的鏈,同時也是事件處理的順序。經過這兩張圖,咱們能夠發現:

    1. 事件順着responder chain傳遞,若是一環不處理,則傳遞到下一環,若是都沒有處理,最後回到UIApplication,再不處理就會拋棄

    2. view的下一級是包含它的viewController,若是沒有viewController則是它的superView

    3. viewController的下一級是它的view的superView

    4. view以後是window,最後傳給application,這點iOS會比OS X簡單(application就一個,window也一個)

    總結出來傳遞規則是這樣的:< 喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICA8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140126/2014012608582353.png" alt="\">

    這樣事件就會從first responder逐級傳遞過來,直到被處理或者被拋棄。


    因爲UI的複雜,這個responder chain是須要根據事件來計算的。好比,我如今在一個view內加入了2個Button,先點擊了一個,則first responder確定是這個點擊過的button,但我下面能夠去點擊另外一個button,因此顯然,當觸摸事件來時,這個chain是須要從新計算更新的,這個計算的順序是事件分發的順序,基本上是分發的反過來。

    \

    不管是哪一種事件,都是系統自己先得到,是iOS系統來傳給UIApplication的,由Application再決定交給誰去處理,因此若是咱們要攔截事件,能夠在UIApplication層面或者UIWindow層面去攔截。

    \

    UIView是如何斷定這個事件是不是本身應該處理的呢?iOS系統檢測到一個觸摸操做時會打包一個UIEvent對象,並放入Application的隊列,Application從隊列中取出事件後交給UIWindow來處理,UIWindow會使用hitTest:withEvent:方法來遞歸的尋找操做初始點所在的view,這個過程成爲hit-test view。

    hitTest:withEvent:方法的處理流程以下:調用當前view的pointInside:withEvent:方法來斷定觸摸點是否在當前view內部,若是返回NO,則hitTest:withEvent:返回nil;若是返回YES,則向當前view內的subViews發送hitTest:withEvent:消息,全部subView的遍歷順序是從數組的末尾向前遍歷,直到有subView返回非空對象或遍歷完成。若是有subView返回非空對象,hitTest方法會返回這個對象,若是每一個subView返回都是nil,則返回本身。

    好了,咱們仍是看個例子:

    \

    這裏ViewA包含ViewB和ViewC,ViewC中繼續包含ViewD和ViewE。假設咱們點擊了viewE區域,則hit-test View斷定過程以下:

    1. 觸摸在A內部,因此須要檢查B和C

    2. 觸摸不在B內部,在C內部,因此須要檢查D和E

    3. 觸摸不在D內部,但在E內部,因爲E已是葉子了,因此斷定到此結束


    咱們能夠運行一段代碼來驗證,首先從UIView繼承一個類myView,重寫裏面的

    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event      
    {      
                                 UIView *retView = nil;      
                                 NSLog(@                         "hitTest %@ Entry! event=%@"                         , self.name, event);      
         
                                 retView = [                         super                         hitTest:point withEvent:event];      
                                 NSLog(@                         "hitTest %@ Exit! view = %@"                         , self.name, retView);      
        
                                 return                         retView;      
    }      


    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event      
    {      
                                 BOOL ret = [                         super                         pointInside:point withEvent:event];      
    //    if ([self.name isEqualToString:@"viewD"]) {      
    //        ret = YES;      
    //    }      
                                 if                         (ret) {      
                                     NSLog(@                         "pointInside %@ = YES"                         , self.name);      
                                 }                         else                         {      
                                     NSLog(@                         "pointInside %@ = NO"                         , self.name);      
                                 }      
         
                                 return                         ret;      
    }      


    4,全局變量,和局部變量再內存佔用上有什麼區別。

    答:http://wenku.baidu.com/link?url=M8NYcU7hpeGOBOX5eAv6PlesQGa_LdXfdB1Nfp5B8vUj1zk6voSW_JGR6GYtecDdBSoItFtasOGTIpTqc6mIeaP4-J9nX7Pz5NEN6bFSN5a

    5,局部變量最大能申請多大的內存,爲何會最大隻能這麼大內存。

    答:iOS平臺 最大 能申請279M 的內存 Iphone4S 平臺測試 long *test = malloc(1024*1024*280);

    6,二分查找函數的實現。

    二分查找又稱折半查找,優勢是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。所以,折半查找方法適用於不常常變更而查找頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。

    答:假設其數組長度爲n,其算法複雜度爲o(log(n))

    下面提供一段二分查找實現的僞代碼:

    BinarySearch(max,min,des)

    mid-<(max+min)/2

    while(min<=max)

    mid=(min+max)/2

    if mid=des then

    return mid

    elseif mid >des then

    max=mid-1

    else

    min=mid+1

    return max

    7,view 中動畫屬性有哪些。

    8,ios  中bound 和view 有什麼區別。

    答;見後面的一遍博文。

    9,局部變量和全局變量有什麼區別。

    答:http://wenku.baidu.com/link?url=ZMY4_Uisy4wyZKa320dmVBiKBUzmWabAasGqw_UFKTfyKvd6JCQwplTpm3Os4hVUeKlfov9Lcpuj5BeRiAUeG23JCDpeiTrPNqp7rpv1C0i

    10,什麼是delegate,他與通知有什麼區別,怎麼才能產生循環引用,爲何會產生循環應用。

    全部的引用計數系統,都存在循環應用的問題。例以下面的引用關係:

    答:

    對象a建立並引用到了對象b.

    對象b建立並引用到了對象c.

    對象c建立並引用到了對象b.

    這時候bc的引用計數分別是21。當a再也不使用b,調用release釋放對b的全部權,由於c還引用了b,因此b的引用計數爲1b不會被釋放。b不釋放,c的引用計數就是1c也不會被釋放。今後,bc永遠留在內存中。

    這種狀況,必須打斷循環引用,經過其餘規則來維護引用關係。好比,咱們常見的delegate每每是assign方式的屬性而不是retain方式 的屬性,賦值不會增長引用計數,就是爲了防止delegation兩端產生沒必要要的循環引用。若是一個UITableViewController 對象a經過retain獲取了UITableView對象b的全部權,這個UITableView對象bdelegate又是a 若是這個delegateretain方式的,那基本上就沒有機會釋放這兩個對象了。本身在設計使用delegate模式時,也要注意這點。

    由於循環引用而產生的內存泄露也是Instrument沒法發現的,因此要特別當心。


    11,當你有一個bug須要處理,然而又有一個商務會議要開怎麼處理

    12,ios程序有幾種狀態。

    答:前臺,後臺,僞後臺。從後臺關閉。

    13,ios 程序controller view 顯示的流程。

    答:

    step1:initWithNib    viewController 會進行alloc,並init.

    step2: loadView       在這裏會看它的子類是否有重寫這個函數,若是重寫了則調用子類的,不然就調用她本身的。注意,這個時                       候視圖仍是沒有沒加載進來的哦。

    step3:viewDidLoad    這個時候視圖已經存在了。能夠在這裏添加你想要添加的UI控件了。

    step4:viewWillAppear 視圖將出如今屏幕上了

    step5:viewDidAppear   視圖已經成功在屏幕上渲染完成了

    step6:viewWillDisappear  視圖將要消失了

    step7:viewDidDisappear  視圖從屏幕上消失了

    step8:viewDidUnLoad  

    14,KVO KVC概念

    15,runtime 具體怎麼用。Runtime編程。

    16,通常用到什麼開源的動畫框架。

    17,通常瀏覽什麼樣的國外網站。技術網站。

    答:

    iOS開發者必備的幾個國外學習網站  

    2012-05-19 17:54:47|  分類: iOS開發|舉報|字號 訂閱

    如今愈來愈多的開發者參與到了,或正在加入iOS等移動操做系統平臺的應用開發行列中來了,iOSAndroid是目前很火的開發領域。在營收方面跟Android相比iOS目前的情況更爲可觀。iOS相關的培訓和教程也愈來愈多。相信國外的英文站對不少英語基礎好的朋友頗有吸引力,一定國外的資源更及時而且更前沿。好的iOS資源學習和工具站會爲咱們的開發和學習頗有幫助。本文介紹了收集到的5iOS海外學習資源站推薦給你們。

    ?5iOS應用開發者海外學習資源站推薦

    1. Snipplr

    Snipplr是個不錯的代碼學習倉庫。Snipplr上面有大量的iOS演示代碼,有用的框架,組件和完整的開源代碼案例。有時當咱們在實現一個功能的時候,在寫Object C代碼要花很多時間和精力。若是想偷懶,能夠到Snipplr上去搜索一下看有沒有相似的完整代碼。它搜索的結果都是站外的連接,若是運氣好的話,只須要把代碼複製出來修改自定義一下不是很省時省力麼。

    2. ShareKit

    ShareKit是一種分享組件,它可能很好地整合到你的應用中。根據個人經驗我以爲建立和配置社交網絡的賬號和API要比將代碼整合到應用中花的時間要長。因此若是你的應用須要分享功能而且是海外用戶羣ShareKit是很不錯的iOS社交分享插件,它可以很容易地被整合到應用中,而且從他那裏能夠了解到目前社交網絡中什麼事物最火,如何將他們整合到應用中。

    3. InAppsSettingsKit

    應用中的設置(配置)功能是全部手機等移動開發者都沒法逃避的工做。若是你想從一開始就將這些工做量減到最低的話,你能夠嘗試瞭解一下InAppsSettingsKit的內容。

    4. GitHub的Objective-C頁面

    GitHub在海外有上百萬的用戶用它來進行代碼分享和協做。儘管Objective CGitHub上只佔到2%左右的內容,可是它的Objective C頁面仍然是iOS開發者的豐富代碼寶藏庫。在這裏你能夠找到知名的和利用普遍的函數庫和Framework等。

    5. CocoaDev

    CocoaDev也是一個很是優秀的關於iOS開發技能的資源學習網站。它提供了很是豐富和完整的iOS開發信息和iOS開發。

    18,NSArray 和NSset遍歷哪一個速度更快,爲何?

      答:    NSSet到底什麼類型,其實它和NSArray功能性質同樣,用於存儲對象,屬於集合; NSSet  , NSMutableSet類聲明編程接口對象,無序的集合,在內存中存儲方式是不連續的,不像NSArray,NSDictionary(都是有序的集合)類聲明編程接口對象是有序集合,在內存中存儲位置是連續的;


            NSSet和咱們經常使用NSArry區別是:在搜索一個一個元素時NSSet比NSArray效率高,主要是它用到了一個算法hash(散列,也可直譯爲哈希);開發文檔中這樣解釋:You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing whether an object is contained in the set is a consideration—while arrays are ordered, testing for membership is slower than with sets.

    好比你要存儲元素A,一個hash算法直接就能直接找到A應該存儲的位置;一樣,當你要訪問A時,一個hash過程就能找到A存儲的位置。而對於NSArray,若想知道A到底在不在數組中,則須要便利整個數組,顯然效率較低了;


           NSSet,NSArray都是類,只能添加cocoa對象,若是須要加入基本數據類型(int,float,BOOL,double等),須要將數據封裝成NSNumber類型

    相關文章
    相關標籤/搜索