史上最全的iOS面試題及答案


史上最全的iOS面試題及答案

 

2static  ()

(1)函數體內 static 變量的作用范圍為該函數體,不同於 auto 變量,該變量的內存只被分配一次, 

因此其值在下次調用時仍維持上次的值; 

(2)在模塊內的 static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問; 

(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明 

它的模塊內; 

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

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

3?

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。 

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

 

1、同步請求可以從因特網請求數據,一旦發送同步請求,程序將停止用戶交互,直至服務器返回數據完成,才可以進行下一步操作,

2、異步請求不會阻塞主線程,而會建立一個新的線程來操作,用戶發出異步請求后,依然可以對UI進行操作,程序可以繼續運行

 

 

asihttp

ASIHTTPRequest是一個簡易使用的類庫,通過包裝CFNetwork API 來簡化 和服務器端的通訊. 它編寫的語言是Objective-C 能夠應用於Mac OS X and iPhone 平台的應用程序.

異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

這個數量是跟cpu有關的,並發性取決於cpu核數,每個核只能同時處理一個任務.4核cpu理論上可以並發處理4個任務,如果按http來算就是4個請求,但是cpu是搶占式資源,所以一般來說並發量是要根據任務的耗時和cpu的繁忙度來計算4個左右只是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不同的。

 

 

2.與的差別。是堆,是棧。的空間由操作系統自動分配釋放,上的空間手動分配釋放。空間有限,是很大的自由存儲區中的函數分配的內存空間即在堆上中對應的是操作符。程序在編譯期對變量和函數分配內存都在棧上進行且程序運行過程中函數調用時參數的傳遞也在棧上進行

 

的內存管理 

??  如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創建對象,您就擁 

有這個對象,需要負責該對象的釋放。這個規則在使用NSObject的便利方法new 時也同樣適用。 

??  如果您拷貝一個對象,您也擁有拷貝得到的對象,需要負責該對象的釋放。 

??  如果您保持一個對象,您就部分擁有這個對象,需要在不再使用時釋放該對象。 

反過來, 

??  如果您從其它對象那里接收到一個對象,則您不擁有該對象,也不應該釋放它(這個規則有少數 

的例外,在參考文檔中有顯式的說明)。 

 

7. iOS 有4種。。。。

數據存儲

 

1.NSKeyedArchiver:采用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議,並且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。

2.NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機后這些數據仍然存在

3.  Write寫入方式:永久保存在磁盤中

:采用數據庫來存儲數據。

 

 

8 , 

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

 

1.  ojc-c 是通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀. 

2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 

3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一. 

 

4.類工廠方法是什么

類工廠方法的實現是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創建的對象,並 進行自動釋放處理。這些方法的形式是+ (type)className…(其中 className不包括任何前綴)。 工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對 象的分配信息。 類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init…方法可以確認一 個類在每次程序運行過程只存在一個實例,但它需要首先分配一個“生的”實例,然后還必須釋放該實例。 工廠方法則可以避免為可能沒有用的對象盲目分配內存。

 

 

 

10單件實例(單例)是什么 

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

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

 

11 

—在運行時確定要調用的方法 

 

動態綁定將調用方法的確定也推遲到運行時。在編譯時,方法的調用並不和代碼綁定在一起,只有在消xi發送出來之后,才確定被調用的代碼。通過動態類型和動態綁定技術,您的代碼每次執行都可以得到不同的結果。運行時因子負責確定消息的接收者和被調用的方法。運行時的消息分發機制為動態綁定提供支持。當您向一個動態類型確定了的對象發送消息時,運行環境系統會通過接收者的isa指針定位對象的類,並以此為起點確定被調用的方法,方法和消息是動態綁定的。而且,您不必在Objective-C 代碼中做任何工作,就可以自動獲取動態綁定的好處。您在每次發送消息時, 

 

特別是當消息的接收者是動態類型已經確定的對象時,動態綁定就會例行而透明地發生。

 

的優缺點 

objc優點: 

  1) Cateogies 種類

  2) Posing 架構

  3) 動態識別 

  7) Objective-C 與 C++ 可混合編程 

缺點: 

  1) 不支持命名空間 

  2)  不支持運算符重載 

  3)不支持多重繼承 

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

 

使用上有什么要注意的地方 

strcpy是一個字符串拷貝的函數,它的函數原型為strcpy(char *dst, c*****t char *src); 

將 src開始的一段字符串拷貝到dst開始的內存中去,結束的標志符號為'\0',由於拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯。具備字符串拷貝功能的函數有memcpy,這是一個內存拷貝函數,它的函數原型為memcpy(char *dst, c*****t char* src, unsigned int len); 

將長度為len的一段內存,從src拷貝到dst中去,這個函數的長度可控。但是會有內存疊加的問題。 

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

 

答案是:   

a) int a; // An integer   

b) int *a; // A pointer to an integer   

c) int **a; // A pointer to a pointer to an integer   

d) int a[10]; // An array of 10 integers   

e) int *a[10]; // An array of 10 pointers to integers   

f) int (*a)[10]; // A pointer to an array of 10 integers   

g) int (*a)(int); // A pointer to a function a that  takes an integer argument and returns an integer   

h) int (*a[10])(int); // An array of 10 pointers to functi*****  that take an integer argument and return an integer 

,,,,,屬性的作用 

@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。這是為了減少對上下文的依賴而引入的機制。 

copy是在你不希望a和b共享一塊內存時會使用到。a和b各自有自己的內存。

5,nonatomic,非原子性訪問,不加同步,多線程並發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級(我是這么理解的...)。

atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環境下,原子操作是必要的,否則有可能引起錯 誤的結果。加了atomic,setter函數會變成下面這樣:

 

什么時候用,什么時候用?答:delegate針對one-to-one關系,並且reciever可以返回值 給sender,notification 可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用於sender希望接受到 reciever的某個功能反饋值,notification用於通知多個object某個事件。 

 

17KVCKVOKVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所需要的環境參數。(2)他會從自己isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。KVO(Key-Value- Observing):當觀察者為一個對象的屬性進行了注冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一個中間類,而不是真實的類。所以 isa指針其實不需要指向實例對象真實的類。所以我們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明確對象實例的類名

的分別是在什么時候調用的?在自定義的時候這幾個函數里面應該做什么工作?答:viewDidLoad在view 從nib文件初始化時調用,loadView在controller的view為nil時調用。此方法在編程實現view時調用,view 控制器默認會注冊memory warning notification,當view controller的任何view 沒有用的時候,viewDidUnload會被調用,在這里實現將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負責release 。

19

這個數據類型則是代表對象本身,這兩者是有區別的。

而NSString只是對象的指針而已。

面向過程就是分析出解決問題所需要的步驟,然后用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。 

面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。;

20類別主要有3個作用:

(1)將類的實現分散到多個不同文件或多個不同框架中。

(2)創建對私有方法的前向引用。

(3)向對象添加非正式協議。

有兩方面局限性:

(1)無法向類中添加新的實例變量,類別沒有位置容納實例變量。

(2)名稱沖突,即當類別中的方法與原始類方法名稱沖突時,類別具有更高的優先級。類別方法將完全取代初始方法從而無法再使用初始方法。

無法添加實例變量的局限可以使用字典對象解決

 

22@synthesize 是系統自動生成getter和setter屬性聲明(iOS4.3 之后不用寫,@property已經具備@synthesize的功能)

 

23Difference between shallow copy and deep copy?

答案:淺層復制:只復制指向對象的指針,而不復制引用對象本身。
深層復制:復制引用對象本身。
意思就是說我有個A對象,復制一份后得到A_copy對象后,對於淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源
還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了
兩份獨立對象本身。
用網上一哥們通俗的話將就是:
淺復制好比你和你的影子,你完蛋,你的影子也完蛋
深復制好比你和你的克隆人,你完蛋,你的克隆人還活着。

24What is advantage of categories? What is difference between implementing a category and inheritance?

答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。
並且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。
類別主要有3個作用:
(1)將類的實現分散到多個不同文件或多個不同框架中。
(2)創建對私有方法的前向引用。
(3)向對象添加非正式協議。
 繼承可以增加,修改或者刪除方法,並且可以增加屬性。

類別和類擴展的區別。
 答案:category和extensions的不同在於 后者可以添加屬性。另外后者添加的方法是必須要實現的。
extensions可以認為是一個私有的Category。

26.Difference between protocol in objective c and interfaces in java?
ocjava
答案:OC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。
informal protocol中的方法屬於設計模式考慮范疇,不是必須實現的,但是如果有實現,就會改變類的屬性。
其實關於正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程里
“非正式協議概念其實就是類別的另一種表達方式“這里有一些你可能希望實現的方法,你可以使用他們更好的完成工作”。
這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然后你在后期可以直接使用這些更好的方法。
這么看,總覺得類別這玩意兒有點像協議的可選協議。"
現在來看,其實protocal已經開始對兩者都統一和規范起來操作,因為資料中說“非正式協議使用interface修飾“,
現在我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。

答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。
很多情況下可以簡化程序代碼。apple文檔其實給了一個很好的例子。
kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體用看到嗯哼用到過的一個地方是對於按鈕點擊變化狀態的的監控。
比如我自定義的一個button
[cpp] 
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; 
#pragma mark KVO 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

    if ([keyPath isEqualToString:@"highlighted"] ) { 
        [self setNeedsDisplay]; 
    } 

對於系統是根據keypath去取的到相應的值發生改變,理論上來說是和kvc機制的道理是一樣的。
對於kvc機制如何通過key尋找到value:
“當通過KVC調用對象時,比如:[self valueForKey:@”someKey”]時,程序會自動試圖通過幾種不同的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。
(cocoachina.com注:Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)
設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最后的機會響應這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處。“
來至cocoa,這個說法應該挺有道理。
因為我們知道button卻是存在一個highlighted實例變量.因此為何上面我們只是add一個相關的keypath就行了,

27What is purpose of delegates?

答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。
另外一點,代理可以理解為java中的回調監聽機制的一種類似。

28What are mutable and immutable types in Objective C?
oc
答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態添加修改和不可動態添加修改一樣。
比如NSArray和NSMutableArray。前者在初始化后的內存控件就是固定不可變的,后者可以添加等,可以動態申請新的內存空間

29When we call objective c is runtime language what does it mean?
oc
答案:多態。主要是將數據類型的確定由編譯時,推遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態。
簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬於生物,豬也屬於生物,都繼承了life后,實現各自的eat,但是調用是我們只需調用各自的eat方法。
也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。
因此也可以說,運行時機制是多態的基礎?~~~

30what is difference between NSNotification and protocol?

答案:協議有控制鏈(has-a)的關系,通知沒有。
首先我一開始也不太明白,什么叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解
簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。
代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。
只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理發布會的消息后,別稱B的
發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。
因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。

31What is push notification?

答案:太簡單,不作答~~~~~~~~~~
這是cocoa上的答案。
其實到不是說太簡單,只是太泛泛的一個概念的東西。就好比說,什么是人。
推送通知更是一種技術。
簡單點就是客戶端獲取資源的一種手段。
普通情況下,都是客戶端主動的pull。
推送則是服務器端主動push。

32.Polymorphism

答案:多態,子類指針可以賦值給父類。
這個題目其實可以出到一切面向對象語言中,
因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。
最重要的是轉化成自我理解。

33

What is responder chain?

答案:事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。
可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了
嚴重懷疑題目出到越后面就越籠統。

和有什么不同?
答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)
bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)

35

方法和選擇器有何不同?
答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現.

36NSOperation queue?
答案:存放NSOperation的集合類。
操作和操作隊列,基本可以看成java中的線程和線程池的概念。用於處理ios多線程開發的問題。
網上部分資料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是按照嚴格的先進現出。
這邊又有個疑點是,對於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,
但是Bfunc是等Afunc完全操作完以后,B才開始啟動並且執行,因此隊列的概念離亂上有點違背了多線程處理這個概念。
但是轉念一想其實可以參考銀行的取票和叫號系統。
因此對於A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。
但是后來看到一票關於這操作隊列話題的文章,其中有一句提到
“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”
瞬間覺得這個queue名字有點忽悠人了,還不如pool~
綜合一點,我們知道他可以比較大的用處在於可以幫組多線程編程就好了。

37What is lazy loading?
答案:懶漢模式,只在用到的時候才去初始化。
也可以理解成延時加載。
我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
一個延時載,避免內存過高,一個異步加載,避免線程堵塞。

是否在一個視圖控制器中嵌入兩個控制器?
答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,
而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController
那樣的感覺。

39Can we use one tableview with two different datasources? How you will achieve this?
tableView
答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法里實現的。
因此我們並不關心如何去關聯他,他怎么關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。
因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?

、代表什么?

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就是實現方法。

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

42GCDGrand Central DispatchGrand 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 .

 

設置下載緩存

它對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 ];

協議詳解

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協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

HTTP URL (URL是一種特殊類型的URI是他的子類,包含了用於查找某個資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過HTTP協議來定位網絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用缺省端口80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。

區別聯系

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協議的差別 

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

傳輸可靠性可靠不可靠 

應用場合傳輸大量數據少量數據 

速度慢快

連接和連接的區別

簡單說,你瀏覽的網頁(網址以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協議的抽象,從而形成了我們知道的一些最基本的函數接口。

51TCP第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)

52Socket建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於服務器端,稱為ServerSocket 。

套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。

1。服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。

2。客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。

3。連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

53進程(process)是一塊包含了某些資源的內存區域。操作系統利用進程把它的工作划分為一些功能單元。

進程中所包含的一個或多個執行單元稱為線程(thread)。進程還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的線程訪問。

通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。

在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。

由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間並發執行的程度。

,,.一個程序就是一個進程,而一個程序中的多個任務則被稱為線程。

 

線程只能歸屬於一個進程並且它只能訪問該進程所擁有的資源。當操作系統創建一個進程后,該進程會自動申請一個名為主線程或首要線程的線程。應用程序(application)是由一個或多個相互協作的進程組成的。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.

54多線程

多線程編程是防止主線程堵塞,增加運行效率等等的最佳方法。而原始的多線程方法存在很多的毛病,包括線程鎖死等。在Cocoa中,Apple提供了NSOperation這個類,提供了一個優秀的多線程編程方法。

本次介紹NSOperation的子集,簡易方法的NSInvocationOperation:

 

一個NSOperationQueue 操作隊列,就相當於一個線程管理器,而非一個線程。因為你可以設置這個線程管理器內可以並行運行的的線程數量等等

55oc語法里的@perpoerty不用寫@synzhesize了,自動填充了。並且的_name;

寫方法時候不用提前聲明。llvm 全局方法便利。

枚舉類型。enum hello:Integer{  } 冒號后面直接可以跟類型,以前是:

enum hello{} 后面在指定為Integer .

橋接。ARC 自動release retain 的時候 CFString CFArray . Core Fountion. 加上橋接_brige  才能區分CFString 和NSString 而現在自動區分了,叫固定橋接。

 

下拉刷新封裝好了。

UICollectionViewController. 可以把表格分成多列。

 

Social Framework(社交集成)

UIActivityViewController來詢問用戶的社交行為

 

緩存:就是存放在臨時文件里,比如新浪微博請求的數據,和圖片,下次請求看這里有沒有值。

56Singleton(單例模式),也叫單子模式,是一種常用的軟件設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。 

代碼如下: 

static ClassA *classA = nil;//靜態的該類的實例 

+ (ClassA *)sharedManager 

{ 

@synchronized(self) { 

if (!classA) { 

classA = [[super allocWithZone:NULL]init]; 

return classA; 

} 

+ (id)allocWithZone:(NSZone *)zone { 

return [[self sharedManager] retain]; 

- (id)copyWithZone:(NSZone *)zone { 

return self; 

- (id)retain { 

return self; 

- (NSUIntger)retainCount { 

return NSUIntgerMax; 

- (oneway void)release { 

- (id)autorelease { 

return self; 

-(void)dealloc{ 

通信建立的過程怎樣,端口有什么作用?
            三次握手,確定是哪個應用程序使用該協議
            

            1.進程和線程的差別。
            線程是指進程內的一個執行單元,也是進程內的可調度實體.
            與進程的區別:
            (1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
            (2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行
            (3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬
            於進程的資源.
            (4)系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開
            銷明顯大於創建或撤消線程時的開銷。
           
            1,進程:子進程是父進程的復制品。子進程獲得父進程數據空間、堆和棧的復制品。
            2,線程:相對與進程而言,線程是一個更加接近與執行體的概念,它可以與同進程的其
            他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
            兩者都可以提高程序的並發度,提高程序運行效率和響應時間。
            線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程
            正相反。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM