面試題及答案java
1.寫一個NSString類的實現ios
+ (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; 程序員
+ (id) stringWithCString: (c*****t char*)nullTerminatedCString 面試
encoding: (NSStringEncoding)encoding 數據庫
{ 編程
NSString *obj; 設計模式
obj = [self allocWithZone: NSDefaultMallocZone()]; 數組
obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; 瀏覽器
return AUTORELEASE(obj); 緩存
}
2static 關鍵字的做用:
(1)函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,
所以其值在下次調用時仍維持上次的值;
(2)在模塊內的 static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明
它的模塊內;
(4)在類中的 static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝;
(5)在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的static 成員變量。
3線程與進程的區別和聯繫?
進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。
程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
4堆和棧的區別
管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leak。
申請大小:
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示overflow。所以,能從棧得到的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。
碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們手工實現。
分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。
5什麼是鍵-值,鍵路徑是什麼
模型的性質是經過一個簡單的鍵(一般是個字符串)來指定的。視圖和控制器經過鍵來查找相應的屬性值。在一個給定的實體中,同一個屬性的全部值具備相同的數據類型。鍵-值編碼技術用於進行這樣的查找—它是一種間接訪問對象屬性的機制。
鍵路徑是一個由用點做分隔符的鍵組成的字符串,用於指定一個鏈接在一塊兒的對象性質序列。第一個鍵的
性質是由先前的性質決定的,接下來每一個鍵的值也是相對於其前面的性質。鍵路徑使您能夠以獨立於模型
實現的方式指定相關對象的性質。經過鍵路徑,您能夠指定對象圖中的一個任意深度的路徑,使其指向相
關對象的特定屬性。
6目標-動做機制
目標是動做消息的接收者。一個控件,或者更爲常見的是它的單元,以插座變量(參見"插座變量"部分)
的形式保有其動做消息的目標。
動做是控件發送給目標的消息,或者從目標的角度看,它是目標爲了響應動做而實現的方法。
程序須要某些機制來進行事件和指令的翻譯。這個機制就是目標-動做機制。
7objc的內存管理
?? 若是您經過分配和初始化(好比[[MyClass alloc] init])的方式來建立對象,您就擁
有這個對象,須要負責該對象的釋放。這個規則在使用NSObject的便利方法new 時也一樣適用。
?? 若是您拷貝一個對象,您也擁有拷貝獲得的對象,須要負責該對象的釋放。
?? 若是您保持一個對象,您就部分擁有這個對象,須要在再也不使用時釋放該對象。
反過來,
?? 若是您從其它對象那裏接收到一個對象,則您不擁有該對象,也不該該釋放它(這個規則有少數
的例外,在參考文檔中有顯式的說明)。
8 自動釋放池是什麼,如何工做
當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,所以自動釋放池定義的做用域內的其它對象能夠向它發送消息。當程序執行到做用域結束的位置時,自動釋放池就會被釋放,池中的全部對象也就被釋放。
1. ojc-c 是經過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數爲一,之後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,若是此對象的計數變爲了0, 就會被系統銷燬.
2. NSAutoreleasePool 就是用來作引用計數的管理工做的,這個東西通常不用你管的.
3. autorelease和release沒什麼區別,只是引用計數減一的時機不一樣而已,autorelease會在對象的使用真正結束的時候才作引用計數減一.
9類工廠方法是什麼
類工廠方法的實現是爲了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被建立的對象,並
進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。
工廠方法可能不只僅爲了方便使用。它們不但能夠將分配和初始化合在一塊兒,還能夠爲初始化過程提供對
象的分配信息。
類工廠方法的另外一個目的是使類(好比NSWorkspace)提供單件實例。雖然init...方法能夠確認一
個類在每次程序運行過程只存在一個實例,但它須要首先分配一個「生的」實例,而後還必須釋放該實例。
工廠方法則能夠避免爲可能沒有用的對象盲目分配內存。
10單件實例是什麼
Foundation 和 Application Kit 框架中的一些類只容許建立單件對象,即這些類在當前進程中的惟一實例。舉例來講,NSFileManager 和NSWorkspace 類在使用時都是基於進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,若是該實例還不存在,則首先進行實例的分配和初始化。單件對象充當控制中心的角色,負責指引或協調類的各類服務。若是類在概念上只有一個實例(好比
NSWorkspace),就應該產生一個單件實例,而不是多個實例;若是未來某一天可能有多個實例,您可
以使用單件實例機制,而不是工廠方法或函數。
11動態綁定
—在運行時肯定要調用的方法
動態綁定將調用方法的肯定也推遲到運行時。在編譯時,方法的調用並不和代碼綁定在一塊兒,只有在消實發送出來以後,才肯定被調用的代碼。經過動態類型和動態綁定技術,您的代碼每次執行均可以獲得不一樣的結果。運行時因子負責肯定消息的接收者和被調用的方法。運行時的消息分發機制爲動態綁定提供支持。當您向一個動態類型肯定了的對象發送消息時,運行環境系統會經過接收者的isa指針定位對象的類,並以此爲起點肯定被調用的方法,方法和消息是動態綁定的。並且,您沒必要在Objective-C 代碼中作任何工做,就能夠自動獲取動態綁定的好處。您在每次發送消息時,
特別是當消息的接收者是動態類型已經肯定的對象時,動態綁定就會例行而透明地發生。
12obj-c的優缺點
objc優勢:
1) Cateogies
2) Posing
3) 動態識別
4) 指標計算
5)彈性訊息傳遞
6) 不是一個過分複雜的 C 衍生語言
7) Objective-C 與 C++ 可混合編程
缺點:
1) 不支援命名空間
2) 不支持運算符重載
3)不支持多重繼承
4)使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優化方法都用不到。(如內聯函數等),性能低劣。
13sprintf,strcpy,memcpy使用上有什麼要注意的地方
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格式化的函數的長度不可控,有可能格式化後的字符串會超出緩衝區的大小,形成溢出。
14答案是:
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
15.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。這是爲了減小對上下文的依賴而引入的機制。
copy是在你不但願a和b共享一塊內存時會使用到。a和b各自有本身的內存。
5,nonatomic,非原子性訪問,不加同步,多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的...)。
atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯 誤的結果。加了atomic,setter函數會變成下面這樣:
16何時用delegate,何時用Notification?答:delegate針對one-to-one關係,而且reciever能夠返回值 給sender,notification 能夠針對one-to-one/many/none,reciever沒法返回值給sender.因此,delegate用於sender但願接受到 reciever的某個功能反饋值,notification用於通知多個object某個事件。
17什麼是KVC和KVO?答:KVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所須要的環境參數。(2)他會從本身isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。KVO(Key-Value- Observing):當觀察者爲一個對象的屬性進行了註冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一箇中間類,而不是真實的類。因此 isa指針其實不須要指向實例對象真實的類。因此咱們的程序最好不要依賴於isa指針。在調用類的方法的時候,最好要明確對象實例的類名
18ViewController 的 loadView, viewDidLoad, viewDidUnload 分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?答: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
"NSMutableString *"這個數據類型則是表明"NSMutableString"對象自己,這二者是有區別的。
而NSString只是對象的指針而已。
面向過程就是分析出解決問題所須要的步驟,而後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就能夠了。
面向對象是把構成問題事務分解成各個對象,創建對象的目的不是爲了完成一個步驟,而是爲了描敘某個事物在整個解決問題的步驟中的行爲。;
20類別的做用
類別主要有3個做用:
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。
(2)建立對私有方法的前向引用。
(3)向對象添加非正式協議。
類別的侷限性
有兩方面侷限性:
(1)沒法向類中添加新的實例變量,類別沒有位置容納實例變量。
(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具備更高的優先級。類別方法將徹底取代初始方法從而沒法再使用初始方法。
沒法添加實例變量的侷限可使用字典對象解決
21關鍵字volatile有什麼含意?並給出三個不一樣的例子:
一個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到
這個變量時必須每次都當心地從新讀取這個變量的值,而不是使用保存在寄存器裏的備份。下面是volatile變量的幾個例子:
• 並行設備的硬件寄存器(如:狀態寄存器)
• 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
• 多線程應用中被幾個任務共享的變量
• 一個參數既能夠是const還能夠是volatile嗎?解釋爲何。
• 一個指針能夠是volatile 嗎?解釋爲何。
下面是答案:
• 是的。一個例子是隻讀的狀態寄存器。它是volatile由於它可能被意想不到地改變。它是const由於程序不該該試圖去修改它。
• 是的。儘管這並不很常見。一個例子是當一箇中服務子程序修該一個指向一個buffer的指針時。
22@synthesize 是系統自動生成getter和setter屬性聲明
@dynamic 是開發者自已提供相應的屬性聲明
@dynamic 意思是由開發人員提供相應的代碼:對於只讀屬性須要提供 setter,對於讀寫屬性須要提供 setter 和 getter。@synthesize 意思是,除非開發人員已經作了,不然由編譯器生成相應的代碼,以知足屬性聲明。
查閱了一些資料肯定@dynamic的意思是告訴編譯器,屬性的獲取與賦值方法由用戶本身實現, 不自動生成。
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)向對象添加非正式協議。 繼承能夠增長,修改或者刪除方法,而且能夠增長屬性。
25.Difference between categories and extensions?
類別和類擴展的區別。
答案:category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。
extensions能夠認爲是一個私有的Category。
26.Difference between protocol in objective c and interfaces in java? oc中的協議和java中的接口概念有何不一樣? 答案:OC中的代理有2層含義,官方定義爲 formal和informal protocol。前者和Java接口同樣。 informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的,可是若是有實現,就會改變類的屬性。 其實關於正式協議,類別和非正式協議我很早前學習的時候大體看過,也寫在了學習教程裏 「非正式協議概念其實就是類別的另外一種表達方式「這裏有一些你可能但願實現的方法,你可使用他們更好的完成工做」。 這個意思是,這些是可選的。好比我門要一個更好的方法,咱們就會申明一個這樣的類別去實現。而後你在後期能夠直接使用這些更好的方法。 這麼看,總以爲類別這玩意兒有點像協議的可選協議。" 如今來看,其實protocal已經開始對二者都統一和規範起來操做,由於資料中說「非正式協議使用interface修飾「, 如今咱們看到協議中兩個修飾詞:「必須實現(@requied)」和「可選實現(@optional)」。
26What are KVO and KVC?
答案: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事件這塊。由於問的太抽象化了 嚴重懷疑題目出到越後面就越籠統。
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 a samplestring。這比如是將起始和結束標籤看做是數學中的左右括號:在沒有關閉全部的內部括號以前,是不能關閉外面的括號的。
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表示要經過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協議的差異
是否鏈接面向鏈接面向非鏈接
傳輸可靠性可靠不可靠
應用場合傳輸大量數據少許數據
速度慢快