天天看點

ios面試題2

31What is push notification?

什麼是推送消息?

答案:太簡單,不作答~~~~~~~~~~

這是cocoa上的答案。

其實到不是說太簡單,隻是太泛泛的一個概念的東西。就好比說,什麼是人。

推送通知更是一種技術。

簡單點就是用戶端擷取資源的一種手段。

普通情況下,都是用戶端主動的pull。

推送則是伺服器端主動push。

32.Polymorphism?

關于多态性

答案:多态,子類指針可以指派給父類。

這個題目其實可以出到一切面向對象語言中,

是以關于多态,繼承和封裝基本最好都有個自我意識的了解,也并非一定要把書上資料上寫的能背出來。

最重要的是轉化成自我了解。

33

What is responder chain?

說說響應鍊

答案:事件響應鍊。包括點選事件,畫面重新整理事件等。在視圖棧内從上至下,或者從下之上傳播。

可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了

嚴重懷疑題目出到越後面就越籠統。

34Difference between frame and bounds?

frame和bounds有什麼不同?

答案:frame指的是:該view在父view坐标系統中的位置和大小。(參照點是父親的坐标系統)

bounds指的是:該view在本身坐标系統中 的位置和大小。(參照點是本身坐标系統)

35

.Difference between method and selector?

方法和選擇器有何不同?

答案:selector是一個方法的名字,method是一個組合體,包含了名字和實作.

36NSOperation queue?

答案:存放NSOperation的集合類。 操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發的問題。 網上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進先出。 這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,

但是Bfunc是等Afunc完全操作完以後,B才開始啟動并且執行,是以隊列的概念離亂上有點違背了多線程處理這個概念。

但是轉念一想其實可以參考銀行的取票和叫号系統。

是以對于A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。

但是後來看到一票關于這操作隊列話題的文章,其中有一句提到

“因為兩個操作送出的時間間隔很近,線程池中的線程,誰先啟動是不定的。”

瞬間覺得這個queue名字有點忽悠人了,還不如pool~

綜合一點,我們知道他可以比較大的用處在于可以幫組多線程程式設計就好了。

37What is lazy loading?

答案:懶漢模式,隻在用到的時候才去初始化。

也可以了解成延時加載。

我覺得最好也最簡單的一個列子就是tableView中圖檔的加載顯示了。

一個延時載,避免記憶體過高,一個異步加載,避免線程堵塞。

38Can we use two tableview controllers on one viewcontroller?

是否在一個視圖控制器中嵌入兩個tableview控制器?

答案:一個視圖控制隻提供了一個View視圖,理論上一個tableViewController也不能放吧,

隻能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,

而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController

那樣的感覺。

39Can we use one tableview with two different datasources? How you will achieve this?

一個tableView是否可以關聯兩個不同的資料源?你會怎麼處理?

答案:首先我們從代碼來看,資料源如何關聯上的,其實是在資料源關聯的代理方法裡實作的。

是以我們并不關心如何去關聯他,他怎麼關聯上,方法隻是讓我傳回根據自己的需要去設定如相關的資料源。

是以,我覺得可以設定多個資料源啊,但是有個問題是,你這是想幹嘛呢?想讓清單如何顯示,不同的資料源分區塊顯示?

40id、nil代表什麼?

id和void *并非完全一樣。在上面的代碼中,id是指向struct objc_object的一個指針,這個意思基本上是說,id是一個指向任何一個繼承了Object(或者NSObject)類的對象。需要注意的是id是一個指針,是以你在使用id的時候不需要加星号。比如id foo=nil定義了一個nil指針,這個指針指向NSObject的一個任意子類。而id *foo=nil則定義了一個指針,這個指針指向另一個指針,被指向的這個指針指向NSObject的一個子類。

nil和C語言的NULL相同,在objc/objc.h中定義。nil表示一個Objctive-C對象,這個對象的指針指向空(沒有東西就是空)。

首字母大寫的Nil和nil有一點不一樣,Nil定義一個指向空的類(是Class,而不是對象)。

SEL是“selector”的一個類型,表示一個方法的名字

Method(我們常說的方法)表示一種類型,這種類型與selector和實作(implementation)相關

IMP定義為 id (*IMP) (id, SEL, …)。這樣說來, IMP是一個指向函數的指針,這個被指向的函數包括id(“self”指針),調用的SEL(方法名),再加上一些其他參數.說白了IMP就是實作方法。

41層和UIView的差別是什麼?

答:兩者最大的差別是,圖層不會直接渲染到螢幕上,UIView是iOS系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由CoreAnimation來實作的。它真正的繪圖部分,是由一個CALayer類來管理。UIView本身更像是一個CALayer的管理器。一個UIView上可以有n個CALayer,每個layer顯示一種東西,增強UIView的展現能力。

42GCD為Grand Central Dispatch的縮寫。  Grand Central Dispatch (GCD)是Apple開發的一個多核程式設計的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。  GCD是一個替代諸如NSThread等技術的很高效和強大的技術。GCD完全可以處理諸如資料鎖定和資源洩漏等複雜的異步程式設計問題。 

 GCD可以完成很多事情,但是這裡僅關注在iOS應用中實作多線程所需的一些基礎知識。  在開始之前,需要了解是要提供給GCD隊列的是代碼塊,用于在系統或者使用者建立的的隊列上排程運作。  聲明一個隊列  

如下會傳回一個使用者建立的隊列:

  dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);其中,第一個參數是辨別隊列的,第二個參數是用來定義隊列的參數(目前不支援,是以傳入NULL)。 

執行一個隊列 

 如下會異步執行傳入的代碼: 

 dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先傳入之前建立的隊列,然後提供由隊列運作的代碼塊。  

聲明并執行一個隊列  

如果不需要保留要運作的隊列的引用,可以通過如下代碼實作之前的功能:  dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });  如果需要暫停一個隊列,可以調用如下代碼。暫停一個隊列會阻止和該隊列相關的所有代碼運作。  dispatch_suspend(myQueue);暫停一個隊列  

如果暫停一個隊列不要忘記恢複。暫停和恢複的操作和記憶體管理中的retain和release類似。調用dispatch_suspend會增加暫停計數,而dispatch_resume則會減少。隊列隻有在暫停計數變成零的情況下才開始運作。dispatch_resume(myQueue);恢複一個隊列   從隊列中在主線程運作代碼  有些操作無法在異步隊列運作,是以必須在主線程(每個應用都有一個)上運作。UI繪圖以及任何對NSNotificationCenter的調用必須在主線程長進行。在另一個隊列中通路主線程并運作代碼的示例如下:  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意,dispatch_suspend (以及dispatch_resume)在主線程上不起作用。

使用GCD,可以讓你的程式不會失去響應. 多線程不容易使用,用了GCD,會讓它變得簡單。你無需專門進行線程管理, 很棒!

dispatch_queue_t t1=dispatch_queue_create("1", NULL);

    dispatch_queue_t t2=dispatch_queue_create("2", NULL);

    dispatch_async(t1, ^{

        [self print1];

    });

    dispatch_async(t2, ^{

        [self print2];

    });

43Provider是指某個iPhone軟體的Push伺服器,這篇文章我将使用.net作為Provider。 

APNS 是Apple Push Notification Service(Apple Push伺服器)的縮寫,是蘋果的伺服器。

上圖可以分為三個階段。

第一階段:.net應用程式把要發送的消息、目的iPhone的辨別打包,發給APNS。 

第二階段:APNS在自身的已注冊Push服務的iPhone清單中,查找有相應辨別的iPhone,并把消息發到iPhone。 

第三階段:iPhone把發來的消息傳遞給相應的應用程式,并且按照設定彈出Push通知。

http://blog.csdn.net/zhuqilin0/article/details/6527113    //消息推送機制

看記憶體洩露時候:在搜尋中搜尋run 找到Run Static Snalyzer .

44.可擴充标記語言extensible markup language;XML

2.用于标記電子檔案使其具有結構性的标記語言,可以用來标記資料、定義資料類型,是一種允許使用者對自己的标記語言進行定義的源語言。

3,資料庫提供了更強有力的資料存儲和分析能力,例如:資料索引、排序、查找、相關一緻性等,XML僅僅是存儲資料。

4.XML與HTML的設計差別是:XML的核心是資料,其重點是資料的内容。而HTML 被設計用來顯示資料,其重點是資料的顯示。

5.XML和HTML文法差別:HTML的标記不是所有的都需要成對出現,XML則要求所有的标記必須成對出現;HTML标記不區分大小寫,XML則大小敏感,即區分大小寫。

結合

  XML的簡單使其易于在任何應用程式中讀寫資料,這使XML很快成為資料交換的唯一公共語言,雖然不同的應用軟體也支援其它的資料交換格式,但不久之後他們都将支援XML,那就意味着程式可以更容易的與Windows,Mac OS,Linux以及其他平台下産生的資訊結合,然後可以很容易加載XML資料到程式中并分析他,并以XML格式輸出結果。

  XML去掉了之前令許多開發人員頭疼的SGML(标準通用标記語言)的随意文法。在XML中,采用了如下的文法:

  1 任何的起始标簽都必須有一個結束标簽。

  2 可以采用另一種簡化文法,可以在一個标簽中同時表示起始和結束标簽。這種文法是在大于符号之前緊跟一個斜線(/),例如<tag/ >。XML解析器會将其翻譯成<tag></tag>。

  3 标簽必須按合适的順序進行嵌套,是以結束标簽必須按鏡像順序比對起始标簽,例如this is asamplestring。這好比是将起始和結束标簽看作是數學中的左右括号:在沒有關閉所有的内部括号之前,是不能關閉外面的括号的。

  4 所有的特性都必須有值。

  5 所有的特性都必須在值的周圍加上雙引号。

45union u

{

 double a;

 int b;

}; 

union u2

{

 char a[13];

 int b;

}; 

union u3

{

 char a[13];

 char b;

}; 

cout<<sizeof(u)<<endl; // 8

cout<<sizeof(u2)<<endl; // 16

cout<<sizeof(u3)<<endl; // 13

  都知道union的大小取決于它所有的成員中,占用空間最大的一個成員的大小。是以對于u來說,大小就是最大的double類型成員a了,是以 sizeof(u)=sizeof(double)=8。但是對于u2和u3,最大的空間都是char[13]類型的數組,為什麼u3的大小是13,而 u2是16呢?關鍵在于u2中的成員int b。由于int類型成員的存在,使u2的對齊方式變成4,也就是說,u2的大小必須在4的對界上,是以占用的空間變成了16(最接近13的對界)。 struct s1

{

 char a;

 double b;

 int c;

 char d; 

}; 

struct s2

{

 char a;

 char b;

 int c;

 double d;

}; 

cout<<sizeof(s1)<<endl; // 24

cout<<sizeof(s2)<<endl; // 16

  同樣是兩個char類型,一個int類型,一個double類型,但是因為對界問題,導緻他們的大小不同。計算結構體大小可以采用元素擺放法,我舉例子說明一下:首先,CPU判斷結構體的對界,根據上一節的結論,s1和s2的對界都取最大的元素類型,也就是double類型的對界8。然後開始擺放每個元素。

  對于s1,首先把a放到8的對界,假定是0,此時下一個空閑的位址是1,但是下一個元素d是double類型,要放到8的對界上,離1最接近的位址是8了,是以d被放在了8,此時下一個空閑位址變成了16,下一個元素c的對界是4,16可以滿足,是以c放在了16,此時下一個空閑位址變成了20,下一個元素d需要對界1,也正好落在對界上,是以d放在了20,結構體在位址21處結束。由于s1的大小需要是8的倍數,是以21- 23的空間被保留,s1的大小變成了24。

  對于s2,首先把a放到8的對界,假定是0,此時下一個空閑位址是1,下一個元素的對界也是1,是以b擺放在1,下一個空閑位址變成了2;下一個元素c的對界是4,是以取離2最近的位址4擺放c,下一個空閑位址變成了8,下一個元素d的對界是 8,是以d擺放在8,所有元素擺放完畢,結構體在15處結束,占用總空間為16,正好是8的倍數。

46ASIDownloadCache 設定下載下傳緩存

它對Get請求的響應資料進行緩存(被緩存的資料必需是成功的200請求):

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];

當設定緩存政策後,所有的請求都被自動的緩存起來。

另外,如果僅僅希望某次請求使用緩存操作,也可以這樣使用:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setDownloadCache:[ASIDownloadCache sharedCache]];

緩存存儲方式

你可以設定緩存的資料需要儲存多長時間,ASIHTTPRequest提供了兩種政策:

a,ASICacheForSessionDurationCacheStoragePolicy,預設政策,基于session的緩存資料存儲。當下次運作或[ASIHTTPRequest clearSession]時,緩存将失效。

b,ASICachePermanentlyCacheStoragePolicy,把緩存資料永久儲存在本地,

如:

ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];

[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];

47HTTP協定詳解

HTTP是一個屬于應用層的面向對象的協定,由于其簡捷、快速的方式,适用于分布式超媒體資訊系統。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中。

 http(超文本傳輸協定)是一個基于請求與響應模式的、無狀态的、應用層的協定,常基于TCP的連接配接方式,HTTP1.1版本中給出一種持續連接配接的機制,絕大多數的Web開發,都是建構在HTTP協定之上的Web應用。

HTTP協定的主要特點可概括如下:

1.支援客戶/伺服器模式。

2.簡單快速:客戶向伺服器請求服務時,隻需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯系的類型不同。由于HTTP協定簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。

3.靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以标記。

4.無連接配接:無連接配接的含義是限制每次連接配接隻處理一個請求。伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。采用這種方式可以節省傳輸時間。

5.無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

48URL

HTTP URL (URL是一種特殊類型的URI是他的子類,包含了用于查找某個資源的足夠的資訊)的格式如下:

http://host[":"port][abs_path]

http表示要通過HTTP協定來定位網絡資源;host表示合法的Internet主機域名或者IP位址;port指定一個端口号,為空則使用預設端口80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那麼當它作為請求URI時,必須以“/”的形式給出,通常這個工作浏覽器自動幫我們完成。

49TCP/UDP差別聯系

TCP---傳輸控制協定,提供的是面向連接配接、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連接配接,之後才能傳輸資料。TCP提供逾時重發,丢棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。 

UDP---使用者資料報協定,是一個簡單的面向資料報的運輸層協定。UDP不提供可靠性,它隻是把應用程式傳給IP層的資料報發送出去,但是并不能保證它們能到達目的地。由于UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連接配接,且沒有逾時重發等機制,故而傳輸速度很快 

TCP(Transmission Control Protocol,傳輸控制協定)是基于連接配接的協定,也就是說,在正式收發資料前,必須和對方建立可靠的連接配接。一個TCP連接配接必須要經過三次“對話”才能建立起來,我們來看看這三次對話的簡單過程:1.主機A向主機B發出連接配接請求資料包;2.主機B向主機A發送同意連接配接和要求同步(同步就是兩台主機一個在發送,一個在接收,協調工作)的資料包;3.主機A再發出一個資料包确認主機B的要求同步:“我現在就發,你接着吧!”,這是第三次對話。三次“對話”的目的是使資料包的發送和接收同步,經過三次“對話”之後,主機A才向主機B正式發送資料。 

UDP(User Data Protocol,使用者資料報協定)是與TCP相對應的協定。它是面向非連接配接的協定,它不與對方建立連接配接,而是直接就把資料包發送過去!  UDP适用于一次隻傳送少量資料、對可靠性要求不高的應用環境。 

tcp協定和udp協定的差别 

是否連接配接面向連接配接面向非連接配接 

傳輸可靠性可靠不可靠 

應用場合傳輸大量資料少量資料 

速度慢快

50socket連接配接和http連接配接的差別

簡單說,你浏覽的網頁(網址以http://開頭)都是http協定傳輸到你的浏覽器的, 而http是基于socket之上的。socket是一套完成tcp,udp協定的接口。

HTTP協定:簡單對象通路協定,對應于應用層  ,HTTP協定是基于TCP連接配接的

tcp協定:    對應于傳輸層

ip協定:     對應于網絡層 

TCP/IP是傳輸層協定,主要解決資料如何在網絡中傳輸;而HTTP是應用層協定,主要解決如何包裝資料。

Socket是對TCP/IP協定的封裝,Socket本身并不是協定,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協定。

http連接配接:http連接配接就是所謂的短連接配接,即用戶端向伺服器端發送一次請求,伺服器端響應後連接配接即會斷掉;

socket連接配接:socket連接配接就是所謂的長連接配接,理論上用戶端和伺服器端一旦建立起連接配接将不會主動斷掉;但是由于各種環境因素可能會是連接配接斷開,比如說:伺服器端或用戶端主機down了,網絡故障,或者兩者之間長時間沒有資料傳輸,網絡防火牆可能會斷開該連接配接以釋放網絡資源。是以當一個socket連接配接中沒有資料的傳輸,那麼為了維持連接配接需要發送心跳消息~~具體心跳消息格式是開發者自己定義的

我們已經知道網絡中的程序是通過socket來通信的,那什麼是socket呢?socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆檔案”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。我的了解就是Socket就是該模式的一個實作,socket即是一種特殊的檔案,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉),這些函數我們在後面進行介紹。我們在傳輸資料時,可以隻使用(傳輸層)TCP/IP協定,但是那樣的話,如果沒有應用層,便無法識别資料内容,如果想要使傳輸的資料有意義,則必須使用到應用層協定,應用層協定有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協定。WEB使用HTTP協定作應用層協定,以封裝HTTP文本資訊,然後使用TCP/IP做傳輸層協定将它發到網絡上。

1)Socket是一個針對TCP和UDP程式設計的接口,你可以借助它建立TCP連接配接等等。而TCP和UDP協定屬于傳輸層 。

  而http是個應用層的協定,它實際上也建立在TCP協定之上。 

 (HTTP是轎車,提供了封裝或者顯示資料的具體形式;Socket是發動機,提供了網絡通信的能力。)

 2)Socket是對TCP/IP協定的封裝,Socket本身并不是協定,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協定。Socket的出現隻是使得程式員更友善地使用TCP/IP協定棧而已,是對TCP/IP協定的抽象,進而形成了我們知道的一些最基本的函數接口。 

繼續閱讀