天天看點

ios面試題整理

1、請手工書寫@property(nonatomic,retain)*name;的get和set方法

getter 

- (Example *)name { return _name; } 

setter 

 -(void)setName:(Example *)aName 

 {  

if (name != aName)  

{  

[name release];  

name = [aName retain];  

 } 

2、請描述object -c記憶體管理機制、以及一般原則.

答:1)當你使用new,alloc和copy方法建立一個對象時,該對象的保留計數器值為1.當你不再使用該對象時,你要負責向該對象發送一條release或autorelease消息.這樣,該對象将在使用壽命結束時被銷毀.

2)每retain一次會使引用系數就加1,相應地要在适當位置release

記憶體管理原則

  1. 1. 誰建立,誰釋放(“誰污染,誰治理”)。如果你通過alloc、new或者(mutable)copy來建立一個對象,那麼你必須調用release或autorelease。或句話說,不是你建立的,就不用你去釋放
  2. 2. 一般來說,除了alloc、new或copy之外的方法建立的對象都被聲明了autorelease(autorelease是延遲釋放記憶體,不用你自己去手動釋放,系統會知道在什麼時候該去釋放掉它。)
  3. 3. 誰retain,誰release。隻要你調用了retain,無論這個對象是如何生成的,你都要調用release

3、nil和NULL的差別?

答:nil是一個對象,而NULL是一個值

4、如何判斷一個對象是否屬于某個類?

respondsToSelector ,performSelector,conformstoProrocol,isKindofClass,isMemberofClass

5、object-c如何實作私有方法?

答:在object-c中沒有私有方法,隻有靜态方法和實力方法.但是可以用@private修飾私有變量.用.m檔案中使用catogory來實作私有方法.

6、BOOL與bool差別?

BOOL 隻是一個宏,不是基本的資料類型,BOOL實際上=int,占4個位元組空間。

bool 是C的基礎資料類型,占用1個位元組。

對于BOOL類型,當值為1時為真,即TRUE;當值為0時為假,即FALSE;

FALSE和TRUE都是宏。

對于bool類型,值隻要不是0就是為真,即true;當值為0時為假,即false

7、用NSLog函數輸出一個浮點類型,結果四舍五入,并保留以為小數.

NSLog(@”%.1f”,(NSNumber *)[@”48.79”, doublueValue])

8、用object-c或者c語言寫一個方法判斷20120101(階乘)在十進制 、二進制下分别為幾位數?

9、用c語言寫一個函數判斷兩個連結清單(單連結清單不存在環)是否相交?

bool IsExitsLoop(slist * head){ slist * slow = head ,  * fast = head; while (fast && fast -> next)

{

slow  =  slow -> next;fast  =  fast -> next -> next;if  ( slow  ==  fast )  break ;

}

return   ! (fast  ==  NULL  ||  fast -> next  ==  NULL);}

11、關鍵字const有什麼含意?

答:結論:

關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊,實際上,聲明一個參數為常量是為了告訴了使用者這個參數的應用目的。

如果你曾花很多時間清理其它人留下的垃圾,

你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式員很少會留下的垃圾讓别人來清理的。)

 通過給優化器一些附加的資訊,使用關鍵字const也許能産生更緊湊的代碼。

合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug 的出現。(1)欲阻止一個變量被改變,可以使用const 關鍵字。在定義該const 變量時,通常需要對它進行初始化,因為以後就沒有(2指針來說,可以指定指針本身為const也可以指定指針所指的資料為nst,或二者同時指定為const;(3)在一個函數聲明中,const 可以修飾形參,表明它是一個輸入參數,在函數内部不能改變其值;(4)對于類的成員函數,若指定其為onst 類型,則表明其是一個常函數,不能修改類的成員變量;(5)對于類的成員函數,有時候必須const 為“值”。

12、線程和程序的差別和聯系?

答:程序和線程都是由作業系統所體會的程式運作的基本單元,系統利用該基本單元實作系統對應用的并發性。 

程序和線程的主要差别在于它們是不同的作業系統資源管理方式。程序有獨立的位址空間,一個程序崩潰後,在保護模式下不會對其它程序産生影響,而線程隻是一個程序中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的位址空間,一個線程死掉就等于整個程序死掉,是以多程序的程式要比多線程的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,隻能用線程,不能用程序。 

13、簡單闡述堆和棧的差別?

答:管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程式員控制,容易産生memory leak。

1.申請大小:棧:在Windows下,棧是向低位址擴充的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就确定的常數),如果申請的空間超過棧的剩時示overflow。是以,能從棧獲得的空間較小。

堆:堆是向高位址擴充的資料結構,是不連續的記憶體區域。這是由于系統是用連結清單來存儲的空閑記憶體位址的,自然是不連續的,而連結清單的周遊方向是由低位址向高位址。堆的大小受限

于計算機系統中有效的虛拟記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

2.碎片問題:對于堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,進而造成大量的碎片,使程式效率降低。對于棧來講,則不會存在這個問題,因為棧是先進後出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個記憶體塊從棧中間彈出

3.配置設定方式:堆都是動态配置設定的,沒有靜态配置設定的堆。棧有2種配置設定方式:靜态配置設定和動态配置設定。靜态配置設定是編譯器完成的,比如局部變量的配置設定。動态配置設定由alloca函數進行配置設定,但是棧的動态配置設定和堆是不同的,他的動态配置設定是由編譯器進行釋放,無需我們手工實作。

4.配置設定效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:配置設定專門的寄存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

14、為什麼很多内置類如UITableViewController的delegate屬性都是assign而不是retain的?

答:會引起循環引用,所有的引用計數系統,都存在循環應用的問題。例如下面的引用關系:

* 對象a建立并引用到了對象b.  

* 對象b建立并引用到了對象c.

* 對象c建立并引用到了對象b. 

這時候b和c的引用計數分别是2和1。  

當a不再使用b,調用release釋放對b的所有權,因為c還引用了b,是以b的引用計數為1,b不會被釋放。

b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在記憶體中。

 這種情況,必須打斷循環引用,通過其他規則來維護引用關系。我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性,

 指派不會增加引用計數,就是為了防止delegation兩端産生不必要的循環引用。

 如果一個UITableViewController 對象a通過retain擷取了UITableView對象b的所有權,這個UITableView對象b的delegate又是a,

 如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。自己在設計使用delegate模式時,也要注意這點。

15、#import跟#include的差別?

答:前者不會引起交叉編譯的問題.因為在object-c中會存在c/c++和object-c混編的問題,如果用include引入頭檔案,會導緻交叉編譯.

16、請寫出你對MVC模式的了解?

答:MVC模式考慮三種對象:模型對象、視圖對象和控制器對象.模型對象負責應用程式的資料和定義操作資料的邏輯;視圖對象知道如何顯示應用程式的模型資料;控制器對象是M與V之間的協調者.

17、什麼是鍵-值,鍵路徑是什麼KVC kVO

答:模型的性質是通過一個簡單的鍵(通常是個字元串)來指定的.視圖和控制器通過鍵來查找相應的屬性值.在一個給定的實體中,同一個屬性的所有的值具有相同的資料類型.鍵-值編碼技術用于進行這樣的查找--它是一種間接通路對象的屬性的機制.    鍵路徑是一個由用點作分隔符的鍵組成的字元串,用于指定一個連接配接在一起的對象性質序列.第一個鍵的性質是由先前的性質決定的,接下來每個鍵的值也是相對于其前面的性質.鍵路徑使你可以獨立于模型實作的方式指定相關對象的性質.通過鍵路徑,你可以指定對象圖中的一個任意深度的路徑,使其指向相關對象的特定屬性.

18、c和object-c如何混用,c++和object-c呢?

答:.1)obj-c的編譯器處理字尾為m的檔案時,可以識别obj-c和c的代碼,處理mm檔案可以識别obj-c,c,c++代碼,但cpp檔案必須隻能用c/c++代碼,而且cpp檔案include的頭檔案中,也不能出現obj-c的代碼,因為cpp隻是cpp 2) 在mm檔案中混用cpp直接使用即可,是以obj-c混cpp不是問題 3)在cpp中混用obj-c其實就是使用obj-c編寫的子產品是我們想要的。 如果子產品以類實作,那麼要按照cpp class的标準寫類的定義,頭檔案中不能出現obj-c的東西,包括#import cocoa的。實作檔案中,即類的實作代碼中可以使用obj-c的東西,可以import,隻是字尾是mm。 如果子產品以函數實作,那麼頭檔案要按c的格式聲明函數,實作檔案中,c++函數内部可以用obj-c,但字尾還是mm或m。 `  總結:隻要cpp檔案和cpp include的檔案中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用實作代碼,實際上cpp混用的是obj-c編譯後的o檔案,這個東西其實是無差别的,是以可以用。obj-c的編譯器支援cpp. 

19、請列舉你熟悉cocoa touch架構(至少三個)

答:

Core Animation 

通過 Core Animation,您就可以通過一個基于組合獨立圖層的簡單的程式設計模型來建立豐富的使用者體驗。 

Core Audio 

Core Audio 是播放,處理和錄制音頻的專業技術,能夠輕松為您的應用程式添加強大的音頻功能。 

Core Data 

提供了一個面向對象的資料管了解決方案,它易于使用和了解,甚至可處理任何應用或大或小的資料模型。

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

當您向一個對象發送一個autorelease 消息時,Cocoa就會将該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,是以自動釋放池定義的作用域内的其它對象可以向它發送消息。當 程式執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。 

1.  ojc-c 是 通過一種"referring counting"(引用計數)的方式來管理記憶體的, 對象在開始配置設定記憶體(alloc)的時候引用計數為一,以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀. 2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 3. autorelease和release沒什麼差別,隻是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一. 

21、object-c的優缺點 

objc優點:   1) Cateogies   2) Posing   3) 動态識别   4) 名額計算   5)彈性訊息傳遞 

  6) 不是一個過度複雜的 C 衍生語言   7) Objective-C 與 C++ 可混合程式設計 缺點:   1) 不支援命名空間  2)  不支援運算符重載 

  3) 不支援多重繼承 

  4) 使用動态運作時類型,所有的方法都是函數調用,是以很多編譯時優化方法都用不到。(如内聯函數等),性能低劣。 

OC沒有多重繼承,Java也沒有  C++才有

OC使用協定來實作多重繼承

22、readwrite,readonly,assign,retain,copy,nonatomic屬性的作用 

@property是一個屬性通路聲明,擴号内支援以下幾個屬性: 

1,getter=getterName,setter=setterName,設定setter與getter的方法名 2,readwrite,readonly,設定可供通路級别 2,assign,setter方法直接指派,不進行任何retain操作,為了解決原類型與環循引用問題3,retain,setter方法對參數進行release舊值再retain新值,所有實作都是這個順序(CC上有相關資料) 4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。 5,nonatomic,非原子性通路,不加同步,多線程并發通路會提高性能。注意,如果不加此屬性,則預設是兩個通路方法都為原子型事務通路。鎖被加到所屬對象執行個體級。

23、ViewController 的 didReceiveMemoryWarning 是在什麼時候被調用的?

記憶體警告會調用didReceiveMemoryWarning

答:相機會出現記憶體不足的情況 去掉調用

 [super didReceiveMemoryWarning];

24、目标-動作機制 

答:目标是動作消息的接收者。一個控件,或者更為常見的是它的單元,以插座變量(參見"插座變量"部分) 的形式保有其動作消息的目标。 

動作是控件發送給目标的消息,或者從目标的角度看,它是目标為了響應動作而實作的方法。 

程式需要某些機制來進行事件和指令的翻譯。這個機制就是目标-動作機制。

25、單件執行個體是什麼

答:Foundation 和 Application Kit 架構中的一些類隻允許建立單件對象,即這些類在目前程序中的唯一執行個體。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基于程序進行單件對象的執行個體化。當向這些類請求執行個體的時候,它們會向您傳遞單一執行個體的一個引用,如果該執行個體還不存在,則首先進行執行個體的配置設定和初始化。單件對象充當控制中心的角色,負責指引或協調類的各種服務。如果類在概念上隻有一個執行個體(比如NSWorkspace),就應該産生一個單件執行個體,而不是多個執行個體;如果将來某一天可能有多個執行個體,您可以使用單件執行個體機制,而不是工廠方法或函數。

26、動态綁定 

答:動态綁定将調用方法的确定也推遲到運作時。在編譯時,方法的調用并不和代碼綁定在一起,隻有在消實發送出來之後,才确定被調用的代碼。通過動态類型和動态綁定技術,您的代碼每次執行都可以得到不同的結果。運作時因子負責确定消息的接收者和被調用的方法。運作時的消息分發機制為動态綁定提供支援。當您向一個動态類型确定了的對象發送消息時,運作環境系統會通過接收者的isa指針定位對象的類,并以此為起點确定被調用的方法,方法和消息是動态綁定的。而且,您不必在Objective-C 代碼中做任何工作,就可以自動擷取動态綁定的好處。您在每次發送消息時, 特别是當消息的接收者是動态類型已經确定的對象時,動态綁定就會例行而透明地發生。 

27、sprintf,strcpy,memcpy使用上有什麼要注意的地方 

答:strcpy是一個字元串拷貝的函數,它的函數原型為strcpy(char *dst, const char *src); 

将src開始的一段字元串拷貝到dst開始的記憶體中去,結束的标志符号為'\0',由于拷貝的長度不是由我們自己控制的,是以這個字元串拷貝很容易出錯。

memcpy,這是一個記憶體拷貝函數,它的函數原型為memcpy(void * dst,const void * src,size_t n); 将長度為len的一段記憶體,從src拷貝到dst中去,這個函數的長度可控。但是會有記憶體疊加的問題。 

sprintf是格式化函數。将一段資料通過特定的格式,格式化到一個字元串緩沖區中去。sprintf格式化的函數的長度不可控,有可能格式化後的字元串會超出緩沖區的大小,造成溢出。

28、objective-c中是所有對象間的互動是如何實作的?

答:通過代理去進行通訊,或者通過觀察者消息模式,Blocks ,appdelegate

29、程式設計中,儲存資料有哪幾種方式?

答:數組、自定義類、檔案操作、資料庫如:SQLite

檔案  plist NSUserDefaults sqlite 

30、Sizeof與strlen的差別和聯系?

sizeof()()用來計算記憶體的strlen用來計算字元長度的。來個具體點的,一看就知道了。char a[] = "hello";sizeof()(a) = 6;strlen(a) = 5;sizeof()會計算字元結尾的\0strlen 不會計算\0sizeof操作符傳回占的空間;而對于一個數組,sizeof傳回這個數組所有元素占的總空間。

而strlen不區分是數組還是指針,就讀到\0為止傳回長度。而且strlen是不把\0計入字元串的長度的。

31、什麼是抽象類?抽象類有什麼作用?能執行個體化嗎?

答:NSOperation 沒有完全實作的類叫抽象類, C++,java

抽象類不能執行個體化, 不能 NSOperation *a =[[NSOperation alloc] init];

32、調用一個類的靜态方法需不需要release?

答:靜态方法就是類方法,不需要,類的方法 ,對象放在autorelease中

33、assign和retain,copy的差別

答:assign就是和普通語言的指派一樣

retain 在一個對象中儲存該對象需要擁有的對象

對該對象進行應用計數+1

@property (retain) 為了寫程式友善

copy主要是指派

一般 代理的申明都是assign 為什麼

原因有2個,

1 根本就沒有必要把代理的計數器+1

2. 主要是為了避免引用技術嵌套,遞歸

34、如何持久儲存資料?

答:NSUserDefaults, Plist, SQLite3, file

35、網絡方面得 比如如何檢測聯網 http  xml等

ASIHTTPRequest  Reacheable.[hm] 

原理是ifconfig 是不是有ip位址

Reachability

來判斷是否有網絡3G Wifi

36、什麼是UDP和TCP的差別是什麼?

答:TCP的全稱為傳輸控制協定。這種協定可以提供面向連接配接的、可靠的、點到點的通信。

UDP的全稱為使用者資料報協定,它可以提供非連接配接的不可靠的點到多點的通信。

用TCP還是UDP,那要看你的程式注重哪一個方面?可靠還是快速?

TCP/IP 建立連接配接的過程 

在TCP/IP協定中,TCP協定提供可靠的連接配接服務,采用三次握手建立一個連接配接。 

第一次握手:建立連接配接時,用戶端發送連接配接請求到伺服器,并進入SYN_SEND狀态,等待伺服器确認; 

第二次握手:伺服器收到用戶端連接配接請求,向用戶端發送允許連接配接應答,此時伺服器進入SYN_RECV狀态; 

第三次握手:用戶端收到伺服器的允許連接配接應答,向伺服器發送确認,用戶端和伺服器進入通信狀态,完成三次握手。 

(所謂的三次握手就是要有三次連接配接資訊的發送/接收過程。TCP連接配接的建立需要進行三次連接配接資訊的發送/接收。)

37、解釋類、對象、執行個體方法和執行個體成員 

答:類:一類事物的抽象,有成員和方法。 

對象:類的執行個體化和具體化 

執行個體方法:主要和類方法差別,類方法聲明時前面用加号,執行個體方法聲明時用減号 

執行個體成員:主要和類成員區分,類成員加static,執行個體成員不需要。

38、類名、方法名、成員名、函數名、宏定義首字母哪些大寫,哪些小寫?

答:大寫:類名,宏定義 

小寫:方法名,成員名,函數名 

39、@public,@protected,@private差別?

答:@public:完全公開,在程式的任何地方都可以調用 

@private:和@public相反,隻能在該類内部不調用 

@protected:隻有自己和自己的子類可以調用 

40、如何聲明一個帶兩個參數的執行個體方法和如何調用(舉例說明)?

答:聲明:-(void)methodForParameter1:(NSString *)p1 Parameter2:(NSString *)p2; 

調用:[self methodForParameter1:@"" Parameter2:@""]; 

41、@property (nonatomic, retain) Example *example; 

getter 

- (Example *)example { return _example; } 

setter 

 -(void)setExample:(Example *)aExample 

 {  

if (example != aExample)  

{  

[example release];  

example = [aExample retain];  

 } 

42、static關鍵字的作用,extern關鍵字的作用?

答:static:定義全局變量;定義類成員;定義内部函數 

extern:聲明外部變量和外部函數,所聲明的變量和函數可能不在本檔案内定義或實作 

43、解釋self ?

答:self就是執行個體本身,在類裡用self來調用自身的方法 

44、什麼時候使用繼承?什麼時候使用類别 ?

答:給一個類增加新的資料成員時用繼承 

隻是想擴充類的方法或覆寫原來的方法時用類别 

45、如何聲明一個類?

@class Example或者 

@interface Example 

@end 

46、寫出1-2個與動态調用有關的方法 ?

答:respondsToSelector 、performSelector、conformsToProtocol、isKindOfClass、isMemberOfClass

47、寫一個協定(舉例),協定有什麼用 ?

@protocol ExampleProtocol  

 - (void)exampleProtocol; 

@end 

@interface ExampleClass : NSObject  

{  

id delegate;  

}  

@property (nonatomic,assign) id delegate;  

@end 

48、存放數字用哪個類,存放CGRect用什麼類型?

存放數字用NSNumber 

存放CGRect用NSValue 

49、快速枚舉(舉例) ?

NSArray *array = [NSArray array]; 

 for (id object in array)  

  [object test]; 

 } 

50、有哪些集合類和存放二進制資料類?

答:NSArray/NSMutableArray,NSDictionary/NSMutableDictionary,NSSet/NSMutableSet/NSCountedSet,NSData存放二進制資料 

51、檔案處理用哪些類(寫1-2個)?

答:NSFileManager\NSUserDefaults open, fopen

52、解釋retain、copy、assgin、autorelease ?

答:retain,copy:計數器加一,差別是retain是原對象計數器加一,copy是建立一個新對象後,新對象計數器加一 

assgin:簡單複制,計數器不變 

autorelease:記憶體延遲釋放,計數器延遲減一 

53、寫出歸檔相關類 ?

答:NSKeyedArchiver、NSKeyedUnarchiver 

54、寫出xml解析和網絡相關類 ?

答:xml解析:NSXMLParser, kissXML GDATA

網絡:NSConnection 

55、常用的xml/json解析和http請求第三方包各寫出一個 ?

答:xml:kissxml 

json:SBJSon 

http請求:ASIHttpRequest SDWebImage, 異步圖檔加載器(界面流暢)

異步mp3 異步video

56、代理和通知的差別?

代理是垂直的,通知可以平行的 

57、寫出幾個常用的設計模式(兩個以上)?

答:MVC設計模式 

單例模式 

代理模式 

通知模式 

工廠模式

簡單介紹集中設計模式:

1)模型視圖控制器(MVC)。控制器負責行為,模型提供資料源,視圖顯示UI。模型和視圖之間盡量不要直接打交道,他們之間的互動應該通過控制器來進行,控制器充當着橋梁的作用。這樣設計的目的是使不同功能的類之間盡量解耦,以利于程式的擴充。

2)代理模式

委托代理(degegate),顧名思義,把某個對象要做的事情委托給别的對象去做。那麼别的對象就是這個對象的代理,代替它來打理要做的事。反映到程式中,首先要明确一個對象的委托方是哪個對象,委托所做的内容是什麼。這裡所做的内容是靠協定中的方法來實作,方法分兩種:必需實作(@required)的方法和根據情況選擇實作(@optional)的方法。

舉個例子:你是房屋租賃中介,某個房東和你簽訂協定,請你替他把房子出租出去。這時,你就是房東的代理,你必須實作的方法是把屋子出租出去,選擇實作的方法是裝修、添置家具、打隔斷等(依據協定而定)。

3)通知模式

通知模式是觀察者模式的一種。a對象在通知中心注冊了觀察者之後,b對象發出通知廣播,a對象收到通知後就知道去做具體的事。觀察者可以是一個或多個,也可以沒有。舉個例子:微網誌切換帳号後會發出一個通知,讓多個界面重新重新整理資料。

4)KVO模式

Key-Value-Observer模式也是觀察者模式的一種。KVO的機制為:當指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應的觀察者。舉個例子,在控制器裡通過addObserver:forKeyPath:options:context:注冊一個資料源觀察者,當資料源裡的資料發生變化時,通過willChangeValueForKey:和didChangeValueForKey:這一對方法發出廣播,控制器收到廣播後就可以利用新的資料來重新整理界面。

5)單例模式

通過單例模式可以保證系統中一個類隻有一個執行個體而且該執行個體易于外界通路,進而友善對執行個體個數的控制并節約系統資源。如果希望在系統中某個類的對象隻能存在一個,單例模式是最好的解決方案。

單例模式有時也是出于現實邏輯的考慮,比如,一個學校隻能有一個校長,校長對象應該就是一個單例對象。雖然從程式的角度你可以初始化多個校長,但這并不符合客觀現實。

58、object-c中frame和bounds差別?

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

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

-(CGRect)frame{

return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);

}

-(CGRect)bounds{

return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);

}

很明顯,bounds的原點是(0,0)點,而frame的原點卻是任意的。

59、object-c有無多重繼承,如何實作?

答:首先object-c不能夠多繼承,但它提供了另外一種解決方案,使對象可以響應在其它類中實作的消息(别的語言中,一般叫方法,兩者無差别). 這種解決方案叫做消息轉發,它可以使一個類響應另外一個類中實作的消息。OC使用協定來實作多重繼承

60、寫一個你所經曆項目架構 或者cocoa裡的MVC模式?

61、如何實作Push 通知的機制(大緻寫下)?

答:1用網站把要發送的消息、目的iPhone的辨別打包,發給APNS。

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

3iPhone把發來的消息傳遞給相應的應用程式, 并且按照設定彈出Push通知

62、如何實作滾動到底部自動加載,以及顯示一個 loading cell?

答:用scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate方法計算是否觸底,調用異步重新整理事件scrollViewDidScroll

63、如何實作從外部打開程式?

在項目的Info.plist檔案中 添加一個 URL types 節點就可以了

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@""]];

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18533221222"]];

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://18533221222"]];

64、代理和通知作用與差別?

答:通知需要有一個通知中心:NSNotificationCenter,自定義通知的話需要給一個名字,然後監聽;優點:通知的發送者和接受者都不需要知道對方.可以指定接收通知的具體方法.通知名可以是任何字元串.缺點:較鍵值觀察(KVO)需要多點代碼,在删除前必須移除監聽者.

代理:通過setDelegate來設定代理對象,最經典的例子是常用的TableView.優點:支援它的類有詳盡和具體資訊.缺點:該類必須支援委托.某一個時間隻能有一個委托連接配接到某一個對象.

代理通常用于一對一的關系,通知可以是一對一或一對多或一對無的關系。代理的receive可以把結果傳回給sender,通知的sender隻負責把消息發送出去不需要傳回結果

65、介紹一下樹?

66、面向對象的特點?

1.資訊隐藏和封裝特性:封裝是把過程和資料包圍起來,對資料的通路隻能通過已定義的界面。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口通路其他對象。2.繼承:繼承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明确表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和執行個體變量,并且類可以修改或增加新的方法使之更适合特殊的需要。3.組合特性組合用于表示類的“整體/部分”關系。例如主機、顯示器、鍵盤、滑鼠組合成一台計算機。4.動态特性(1)抽象:抽象就是忽略一個主題中與目前目标無關的那些方面,以便更充分地注意與目前目标有關的方面。抽象并不打算了解全部問題,而隻是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。(2)多态性:多态性是指允許不同類的對象對同一消息作出響應。多态性包括參數化多态性和包含多态性。多态性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程式函數同名問題。

67、動畫實作一個view從頂部移動到底部?

68、用預處理指令#define定義求兩個數中的較大值?

69、闡述static關鍵字的作用?

(1)設定變量的存儲域,函數體内static變量的作用範圍為該函數體,不同于auto變量,該變量的記憶體隻被配置設定一次,是以其值在下次調用時仍維持上次的值;

(2)限制變量的作用域,在子產品内的static全局變量可以被子產品内所用函數通路,但不能被子產品外其它函數通路;

(3)限制函數的作用域,在子產品内的static函數隻可被這一子產品内的其它函數調用,這個函數的使用範圍被限制在聲明它的子產品内;(4)在類中的static成員變量意味着它為該類的所有執行個體所共享,也就是說當某個類的執行個體修改了該靜态成員變量,其修改值為該類的其它所有執行個體所見;(5)在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針,因而隻能通路類的static成員變量。

70、定義屬性時,什麼情況使用copy,assign,和retain?

71、object-c中protocol、se'le'c'tselector、category是什麼?

72、怎麼讀取本地檔案内容?

    NSString *path = [[NSBundle mainBundle]pathForResource:@"Util-Info" ofType:@"plist"];

    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];

73、iPhone開發的兩種方式是什麼,各自的優缺點。

答:Web開發和SDK程式設計,這兩種開發方式各有利弊,但他們都能為應用程式提供豐富、強大的功能。由于兩種開發模型在本質上存在差異,是以他們各自适用的開發情形也不相同。Web開發适合建立功能簡單、動态且需要網際網路連接配接的應該程式,而SDK程式設計适合建立功能複雜、強大的應用程式。

74、OC的兩種記憶體管理方式,iOS都支援嗎?

答:MRR,手動管理.ARC,自動引用計數.ios都支援.

75、Notification是什麼,優缺點是什麼,用什麼可以代替。

76、用OC寫一個單例

+(id)shareDefault

+(id)shareDefault

{

Static id s;

If(s==nil)

{

S=[[self alloc] init]

}

Return s;

}

77、Asi 的缺點(扯到第三方的時候問得)?

78、請問關鍵字 alloc 和 init 的 差別?

答:alloc是配置設定記憶體,對象計數器為1 init是初始化工作  類似于c++構造函數

79、請寫出實作多線程操作涉及的類及 簡單 示例;

答: NSThread, NSOperation, Blocks/GCD, pthread都是多線程操作函數

常用 NSThread detachNewThreadSelector

NSOperation是在網絡上用的多寫 繼承NSOperation 實作了main函數

Blocks是也是工作線程

80、請分别簡述 notification 的同步和異步的調用方法

是廣播模式/觀察者模式,可以異步檢視系統或者自定義一些事件

81、view 和 viewcontroller 的 關系?

答:UIviewController其實相當于一個容器,一個控制器,裡面包含了一個根的uiview

M(MutableArray DB)  C  V

82、用static 修飾 的 變量和 函數的意義分别是 什麼?

static 可以修飾函數作用域,

static修飾變量作用域 或者檔案内全局/局部變量

有時候有static inline混在一起内聯編譯

83、http 協定,get, post差別?

get是簡單的http協定

post是從用戶端送出複雜的參數,包括檔案

84、.#import,#inlcude與@class的差別?

答:1)假如有三個類A,B,C,B頭檔案中包含了C,A頭檔案包含了B和C,此時若用#include,則會提示C被重複定義的錯誤,而用#import則可以編譯通過。這是因為#import會作判斷,不會引起重複編譯的問題。

2)@class僅是聲明了一個類的名稱,若在頭檔案中聲明了@class,并聲明了該類的對像,則在源檔案中還要把該類#import進來。

假如有兩個類X和Y,X中#import了Y,Y中#import了X,此時若在X中聲明Y *y;或在Y中聲明了X *x;編譯時會報錯:找不到Y或X的定義。

解決方法為在X,Y的頭檔案中用@class先聲明,然後在源檔案裡#import

3)在iOS開發中,Objective-c類應使用#import,C/C++類應使用#include

85、Difference between shallowcopy and deep copy? 淺複制和深複制的差別?

淺層複制:隻複制指向對象的指針,而不複制引用對象本身。深層複制:複制引用對象本身。

比如有個A對象,複制一份後得到A_copy對象後,對于淺複制來說,A和A_copy指向的是同一個記憶體資源,複制的隻不過是是一個指針,對象本身資源還是隻有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改 。深複制就好了解了,記憶體中存在了兩份獨立對象本身。

打個比方:淺複制好比你和你的影子,你完蛋,你的影子也完蛋。深複制好比你和你的克隆人,你完蛋,你的克隆人還活着。

86、.What is advantage ofcategories? What is difference between implementing a category and inheritance?類别的作用?繼承和類别在實作中有何差別?

答:類别可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,隻能添加,不能删除或修改。并且如果類别和原來類中的方法産生名稱沖突(名稱重複),則類别将覆寫原來的方法,因為類别具有更高的優先級。類别主要有3個作用:(1)将類的實作分散到多個不同檔案或多個不同架構中。(2)建立對私有方法的前向引用。(3)向對象添加非正式協定。

 繼承可以增加或修改 方法,并且可以增加屬性。

87、Difference between method and selector?方法和選擇器有何不同?

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

88、What is lazy loading?

懶漢模式,隻在用到的時候才去初始化。也可以了解成延時加載。最簡單的一個列子就是tableView中圖檔的加載顯示了。一個延時加載,避免記憶體過高,一個異步加載,避免線程堵塞。

89、static 關鍵字的作用?

(1)函數體内static 變量的作用範圍為該函數體,不同于 auto 變量,該變量的記憶體隻被配置設定一次,是以其值在下次調用時仍維持上次的值;

(2)在子產品内的static 全局變量可以被子產品内所用函數通路,但不能被子產品外其它函數通路;

(3)在子產品内的static 函數隻可被這一子產品内的其它函數調用,這個函數的使用範圍被限制在聲明它的子產品内;

(4)在類中的static 成員變量屬于整個類所擁有,對類的所有對象隻有一份拷貝;

(5)在類中的static 成員函數屬于整個類所擁有,這個函數不接收this 指針,因而隻能通路類的static 成員變量。

90、在一個對象的方法裡面: self.name = “object”;和name =”object”有什麼不同嗎? 

 答:self.name = "object"會調用對象的setName()方法,會使object引用計數加1,name = "object"會直接把object指派給目前對象的name 屬性,引用計數不增加。

91、WebSocket 協定

WebSocket 協定本質上是一個基于 TCP 的協定。為了建立一個 WebSocket 連接配接,用戶端浏覽器首先要向伺服器發起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭資訊,其中附加頭資訊”Upgrade: WebSocket”表明這是一個申請協定更新的 HTTP 請求,伺服器端解析這些附加的頭資訊然後産生應答資訊傳回給用戶端,用戶端和伺服器端的 WebSocket 連接配接就建立起來了,雙方就可以通過這個連接配接通道自由的傳遞資訊,并且這個連接配接會持續存在直到用戶端或者伺服器端的某一方主動的關閉連接配接。