NO IMAGE

http://blog.cocoachina.com/article/17120

http://www.cocoachina.com/programmer/20151019/13746.html

http://www.henishuo.com/ios-baoku-interview-questions/

http://www.henishuo.com/ios-needgo-interview/

http://www.henishuo.com/ios-interview-entrance/

1.講一下你們的專案結構,使用的設計模式(針對專案中的模組化提問.PS一般都是按照功能分模組)
   專案對比其他專案有什麼新的技術.    在專案中做的非功能性模組有哪些

2.MVC設計模式中C層需要做哪些工作,對MVVM的理解以及對比MVC中C層中功能拆解位置劃分
  例如:對於MVC中C層中資料處理轉為MVVM是所處的位置VM層還是M層(胖瘦Model的問題)
3.view的frame和bounds.當對view進行旋轉之後frame以及bounds有什麼變化
4.UIView和CALayer的關係以及各自的繼承關係.
5.iOS中的事件響應機制(response Chain)
6.TCP,UDP有什麼區別,講解一些對於Socket的理解
7.Decorator模式與Category,給類新增方法(繼承,Category和Runtime新增) 工廠模式和抽象工廠模式
8.代理和protocol的作用
9.動畫的種類和實現過程(basic動畫,keyFrame動畫,Spring動畫)
10.Blocks根據在記憶體中所處的位置有哪幾種(global,stack,heap),global和stack型別的區別
   當一個block中使用時全域性變數之後屬於哪一種
   能不能將block新增到陣列或者字典中,會有什麼問題
11.Runtime有什麼使用場景 根據使用場景提問
12.解釋一下RunLoop,RunLoop有幾種狀態,RunLoop的mode有什麼作用,RunLoop與執行緒之間的關係
     NSTimer與RunLoop的經典問題 怎麼解決
     RunLoop的mode切換需要做什麼(自定義的非同步執行緒)PS 可能跟source1和source0有關
     系統是怎麼實現RunLoop的mode切換
13.ARC下的autoreleasePool(手動建立和RunLoop建立)
[email protected]以及在記憶體佈局中的儲存(方法和成員變數分開儲存)
15.Category實現原理   執行時Category中的方法和class中的方法是整合還是分開
     Category中實現和class中的相同的方法   呼叫時會執行哪個
     多個Category實現和class中的相同方法  呼叫時會執行哪個 順序與什麼有關
16.怎麼實現執行緒管理  GCD和RunLoop有什麼關聯  GCD中使用 dispatch_get_mainQueue執行的方法 會在當前的EventLoop中      還是下一次的EventLoop
17.TableView的優化點  CornerRadium與效能瓶頸  tableView會造成卡頓的原因
18.使用DrawRect繪製NString和使用Label展示NSString效能那個高 為什麼
19.NSOperation跟GCD關係

1、Object-C有多繼承嗎?沒有的話用什麼代替?

cocoa 中所有的類都是NSObject 的子類

多繼承在這裡是用protocol 委託代理 來實現的

你不用去考慮繁瑣的多繼承 ,虛基類的概念.

ood的多型特性 在 obj-c 中通過委託來實現.
2、Object-C有私有方法嗎?私有變數呢?
objective-c – 類裡面的方法只有兩種, 靜態方法和例項方法. 這似乎就不是完整的物件導向了,按照OO的原則就是一個物件只暴露有用的東西. 如果沒有了私有方法的話, 對於一些小範圍的程式碼重用就不那麼順手了.
在類裡面聲名一個私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
– (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) –
(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變數
在Objective‐C中,所有例項變數預設都是私有的,所有例項方法預設都是公有的
3、關鍵字const什麼含義?
const意味著”只讀”,下面的宣告都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const; 
前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。
結論:
•; 關鍵字const的作用是為給讀你程式碼的人傳達非常有用的資訊,實際上,宣告一個引數為常量是為了告訴了使用者這個引數的應用目的。如果
你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式設計師很少會留下的垃圾讓別人來清
理的。)
•; 通過給優化器一些附加的資訊,使用關鍵字const也許能產生更緊湊的程式碼。
•; 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的引數,防止其被無意的程式碼修改。簡而言之,這樣可以減少bug的出現。 
欲阻止一個變數被改變,可以使用 const 關鍵字。在定義該 const 變數時,通常需要對它進行初
始化,因為以後就沒有機會再去改變它了;
(2)對指標來說,可以指定指標本身為 const,也可以指定指標所指的資料為 const,或二者同時指
定為 const;
(3)在一個函式宣告中,const 可以修飾形參,表明它是一個輸入引數,在函式內部不能改變其值;
(4)對於類的成員函式,若指定其為 const 型別,則表明其是一個常函式,不能修改類的成員變數;
(5)對於類的成員函式,有時候必須指定其返回值為 const 型別,以使得其返回值不為“左值”。
4、關鍵字volatile有什麼含義?並給出三個不同例子?
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到
這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:
• 並行裝置的硬體暫存器(如:狀態暫存器)
• 一箇中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
• 多執行緒應用中被幾個任務共享的變數 
• 一個引數既可以是const還可以是volatile嗎?解釋為什麼。
• 一個指標可以是volatile 嗎?解釋為什麼。 
下面是答案:
• 是的。一個例子是隻讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。
• 是的。儘管這並不很常見。一個例子是當一箇中服務子程式修該一個指向一個buffer的指標時。 
static作用?
函式體內 static 變數的作用範圍為該函式體,不同於 auto 變數,該變數的記憶體只被分配一次,
因此其值在下次呼叫時仍維持上次的值;
(2)在模組內的 static 全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;
(3)在模組內的 static 函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告
它的模組內;
(4)在類中的 static 成員變數屬於整個類所擁有,對類的所有物件只有一份拷貝;
(5)在類中的 static 成員函式屬於整個類所擁有,這個函式不接收 this 指標,因而只能訪問類的static 成員變數。
6、#import和#include的區別,@class代表什麼?
@class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到,在m檔案中還是需要使用#import
而#import比起#include的好處就是不會引起重複包含
7、執行緒和程序的區別?
程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。
程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。
8、堆和棧的區別?
管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。
申請大小:
棧:在Windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有一個記憶體塊從棧中間彈出
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的。
9、Object-C的記憶體管理?
1.當你使用new,alloc和copy方法建立一個物件時,該物件的保留計數器值為1.當你不再使用該物件時,你要負責向該物件傳送一條release或autorelease訊息.這樣,該物件將在使用壽命結束時被銷燬.
2.當你通過任何其他方法獲得一個物件時,則假設該物件的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確保該物件被清理.如果你打算在一段時間內擁有該物件,則需要保留它並確保在操作完成時釋放它.
3.如果你保留了某個物件,你需要(最終)釋放或自動釋放該物件.必須保持retain方法和release方法的使用次數相等.
10、為什麼很多內建的類,如TableViewController的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模式時,也要注意這點。
11、定義屬性時,什麼情況使用copy、assign、retain?
assign用於簡單資料型別,如NSInteger,double,bool,
retain和copy用於物件,
copy用於當a指向一個物件,b也想指向同樣的物件的時候,如果用assign,a如果釋放,再呼叫b會crash,如果用copy 的方式,a和b各自有自己的記憶體,就可以解決這個問題。
retain 會使計數器加一,也可以解決assign的問題。
另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。
加了atomic,setter函式會變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
12、物件是什麼時候被release的?
引用計數為0時。
autorelease實際上只是把對release的呼叫延遲了,對於每一個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被呼叫Release。對於每一個Runloop, 系統會隱式建立一個Autorelease pool,這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autorelease
pool會被銷燬,這樣這個pool裡的每個Object(就是autorelease的物件)會被release。那什麼是一個Runloop呢? 一個UI事件,Timer call, delegate call, 都會是一個新的Runloop
13、iOS有沒有垃圾回收?
Objective-C 2.0也是有垃圾回收機制的,但是只能在Mac OS X Leopard 10.5 以上的版本使用。
14、tableView的重用機制?
檢視UITableView標頭檔案,會找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells兩個結構。visiableCells內儲存當前顯示的cells,reusableTableCells儲存可重用的cells。
  TableView顯示之初,reusableTableCells為空,那麼tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。開始的cell都是通過[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]來建立,而且cellForRowAtIndexPath只是呼叫最大顯示cell數的次數。
  比如:有100條資料,iPhone一屏最多顯示10個cell。程式最開始顯示TableView的情況是:
  1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]建立10次cell,並給cell指定同樣的重用標識(當然,可以為不同顯示型別的cell指定不同的標識)。並且10個cell全部都加入到visiableCells陣列,reusableTableCells為空。
  2. 向下拖動tableView,當cell1完全移出螢幕,並且cell11(它也是alloc出來的,原因同上)完全顯示出來的時候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
3. 接著向下拖動tableView,因為reusableTableCells中已經有值,所以,當需要顯示新的cell,cellForRowAtIndexPath再次被呼叫的時候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之後再需要顯示的Cell就可以正常重用了。
15、ViewController 的loadView、viewDidLoad、viewDidUnload分別是什麼時候呼叫的,在自定義ViewCointroller時在這幾個函式中應該做什麼工作?
由init、loadView、viewDidLoad、viewDidUnload、dealloc的關係說起
init方法
在init方法中例項化必要的物件(遵從LazyLoad思想)
init方法中初始化ViewController本身
loadView方法
當view需要被展示而它卻是nil時,viewController會呼叫該方法。不要直接呼叫該方法。
如果手工維護views,必須過載重寫該方法
如果使用IB維護views,必須不能過載重寫該方法
loadView和IB構建view
你在控制器中實現了loadView方法,那麼你可能會在應用執行的某個時候被記憶體管理控制呼叫。 如果裝置記憶體不足的時候, view 控制器會收到didReceiveMemoryWarning的訊息。 預設的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次呼叫來建立一個新的view。
viewDidLoad方法
viewDidLoad 此方法只有當view從nib檔案初始化的時候才被呼叫。
過載重寫該方法以進一步定製view
在iPhone OS 3.0及之後的版本中,還應該過載重寫viewDidUnload來釋放對view的任何索引
viewDidLoad後呼叫資料Model
viewDidUnload方法
當系統記憶體吃緊的時候會呼叫該方法(注:viewController沒有被dealloc)
記憶體吃緊時,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用記憶體的唯一方式,但是OS 3.0及以後viewDidUnload方法是更好的方式
在該方法中將所有IBOutlet(無論是property還是例項變數)置為nil(系統release view時已經將其release掉了)
在該方法中釋放其他與view有關的物件、其他在執行時建立(但非系統必須)的物件、在viewDidLoad中被建立的物件、快取資料等 release物件後,將物件置為nil(IBOutlet只需要將其置為nil,系統release view時已經將其release掉了)
一般認為viewDidUnload是viewDidLoad的映象,因為當view被重新請求時,viewDidLoad還會重新被執行
viewDidUnload中被release的物件必須是很容易被重新建立的物件(比如在viewDidLoad或其他方法中建立的物件),不要release使用者資料或其他很難被重新建立的物件
dealloc方法
viewDidUnload和dealloc方法沒有關聯,dealloc還是繼續做它該做的事情
16、ViewController的didReceiveMemoryWarning是在什麼時候呼叫的?預設的操作是什麼?
當程式接到記憶體警告時View Controller將會收到這個訊息:didReceiveMemoryWarning
從iOS3.0開始,不需要過載這個函式,把釋放記憶體的程式碼放到viewDidUnload中去。
這個函式的預設實現是:檢查controller是否可以安全地釋放它的view(這裡加粗的view指的是controller的view屬性),比如view本身沒有superview並且可以被很容易地重建(從nib或者loadView函式)。
如果view可以被釋放,那麼這個函式釋放view並呼叫viewDidUnload。
你可以過載這個函式來釋放controller中使用的其他記憶體。但要記得呼叫這個函式的super實現來允許父類(一般是UIVIewController)釋放view。
如果你的ViewController儲存著view的子view的引用,那麼,在早期的iOS版本中,你應該在這個函式中來釋放這些引用。而在iOS3.0或更高版本中,你應該在viewDidUnload中釋放這些引用。
17、列舉Cocoa中常見的集中多執行緒的實現,並談談多執行緒安全的幾種解決辦法,一般什麼地方會用到多執行緒?
NSThread,GCD等。儘量用上層分裝好的方法去實現多執行緒而不是手動呼叫NSThread。
18、怎麼理解MVC,在Cocoa中MVC是怎麼實現的?
Model: 代表你的應用程式是什麼(不是怎麼展現)
Controller:
控制你的Model怎麼展現給使用者(UI邏輯)
View: Controller的奴隸。。。

Model,Controller,View相互通訊的規則:

  1. Controller可以直接和Model通訊
  2. Controller也可以直接和View通訊
  3. Model和View永遠不能直接通訊
  4. iOS中View和Controller的通訊是透明和固定的,主要通過outlet和action實現
  5. View使用Delegate介面和Controller同步資訊
  6. View不直接和資料通訊,使用dataSource介面從Controller處獲取資料
  7. View的delegate和dataSource一般就是Controller
  8. Controller負責為View翻譯和格式化Model的資料
  9. Model使用Notification & KVO的方式分發資料更新資訊,Controller可以有選擇的監聽自己感興趣的資訊。
  10. View也可以監聽廣播資訊,但一般不是Model發出的資訊
  11. 一個完整的App就是很多MVC的集合
19、delegate和notification區別,分別在什麼情況下使用?

Delegate:
訊息的傳送者(sender)告知接收者(receiver)某個事件將要發生,delegate同意然然後傳送者響應事件,delegate機制使得接收者可以改變傳送者的行為。通常傳送者和接收者的關係是直接的一對多的關係。

Notification:
訊息的傳送者告知接收者事件已經發生或者將要傳送,僅此而已,接收者並不能反過來影響傳送者的行為。通常傳送者和接收者的關係是間接的多對多關係。

 

1. 效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特徵是,delegate方法往往需要關注返回值,也就是delegate方法的結果。比如-windowShouldClose:,需要關心返回的是yes還是no。所以delegate方法往往包含should這個很傳神的詞。也就是好比你做我的delegate,我會問你我想關閉視窗你願意嗎?你需要給我一個答案,我根據你的答案來決定如何做下一步。相反的,notification最大的特色就是不關心接受者的態度,我只管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。所以notification往往用did這個詞彙,比如NSWindowDidResizeNotification,那麼nswindow物件放出這個notification後就什麼都不管了也不會等待接受者的反應。

 

1)兩個模組之間聯絡不是很緊密,就用notification傳值,例如多執行緒之間傳值用notificaiton。

2)delegate只是一種較為簡單的回撥,且主要用在一個模組中,例如底層功能完成了,需要把一些值傳到上層去,就事先把上層的函式通過delegate傳到底層,然後在底層call這個delegate,它們都在一個模組中,完成一個功能,例如說 NavgationController 從 B 介面到A 點返回按鈕 (呼叫popViewController方法) 可以用delegate比較好。

20、self.跟self什麼區別?


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


22、記憶體管理 Autorelease、retain、copy、assign的set方法和含義?

 

1,你初始化(alloc/init)的物件,你需要釋放(release)它。例如:

  NSMutableArray aArray = [[NSArray alloc] init];

  後,需要

  [aArray release];

  2,你retain或copy的,你需要釋放它。例如:

  [aArray retain]

  後,需要

  [aArray release];

  3,被傳遞(assign)的物件,你需要斟酌的retain和release。例如:

  obj2 = [[obj1 someMethod] autorelease];

  物件2接收物件1的一個自動釋放的值,或傳遞一個基本資料型別(NSInteger,NSString)時: 你或希望將物件2進行retain,以防止它在被使用之前就被自動釋放掉。但是在retain後,一定要在適當的時候進行釋放。

 

關於索引計數(Reference Counting)的問題

  retain值 = 索引計數(Reference Counting)

  NSArray物件會retain(retain值加一)任何陣列中的物件。當NSArray被解除安裝(dealloc)的時候,所有陣列中的物件會被執行一次釋放(retain值減一)。不僅僅是NSArray,任何收集類(Collection Classes)都執行類似操作。例如NSDictionary,甚至UINavigationController。

  Alloc/init建立的物件,索引計數為1。無需將其再次retain。

  [NSArray array]和[NSDate date]等“方法”建立一個索引計數為1的物件,但是也是一個自動釋放物件。所以是本地臨時物件,那麼無所謂了。如果是打算在全Class中使用的變數(iVar),則必須retain它。

  預設的類方法返回值都被執行了“自動釋放”方法。(*如上中的NSArray)

  在類中的解除安裝方法“dealloc”中,release所有未被平衡的NS物件。(*所有未被autorelease,而retain值為1的)


23、類別的作用?

 

有時我們需要在一個已經定義好的類中增加一些方法,而不想去重寫該類。比如,當工程已經很大,程式碼量比較多,或者類中已經包住很多方法,已經有其他程式碼呼叫了該類建立物件並使用該類的方法時,可以使用類別對該類擴充新的方法。

  注意:類別只能擴充方法,而不能擴充成員變數。


24、委託(舉例)

 

委託代理(degegate),顧名思義,把某個物件要做的事情委託給別的物件去做。那麼別的物件就是這個物件的代理,代替它來打理要做的事。反映到程式中,首先要明確一個物件的委託方是哪個物件,委託所做的內容是什麼。

委託機制是一種設計模式,在很多語言中都用到的,這只是個通用的思想,網上會有很多關於這方面的介紹。

那麼在蘋果開發過程中,用到委託的程式實現思想如下,我主要拿如何在檢視之間傳輸資訊做個例子。

譬如:在兩個頁面(UIIview檢視物件)實現傳值,用委託(delegate)可以很好做到!

方法:

類A

@interface A:UIView

        id transparendValueDelegate;

       @property(nomatic, retain) id transparendValueDelegate;

@end

@implemtion A

@synthesize transparendValueDelegate

-(void)Function

      NSString* value = @"hello";

      //讓代理物件執行transparendValue動作

      [transparendValueDelegate transparendValue: value];

}

@end

類B

@interface B:UIView

      NSString* value;

@end

@implemtion B

-(void)transparendValue:(NSString*)fromValue

{

      value = fromValue;

      NSLog(@"the value is %@ ",value); 

}

@end

//下面的設定A代理委託物件為B

//在定義A和B類物件處:

A* a = [[A alloc] init];

B* b = [[B alloc] init];

a. transparendValueDelegate = b;//設定物件a代理為物件b

這樣在檢視A和B之間可以通過委託來傳值!


25、retainCount?

26..屬性readwrite,readonly,assign,retain,copy,nonatomic
各是什麼作用,在那種情況下用

 

assign:指定setter方法用簡單的賦值,這是預設操作。你可以對標量型別(如int)使用這個屬性。你可以想象一個float,它不是一個物件,所以它不能retain、copy。

retain:指定retain應該在後面的物件上呼叫,前一個值傳送一條release訊息。你可以想象一個NSString例項,它是一個物件,而且你可能想要retain它。

copy:指定應該使用物件的副本(深度複製),前一個值傳送一條release訊息。基本上像retain,但是沒有增加引用計數,是分配一塊新的記憶體來放置它。

readonly:將只生成getter方法而不生成setter方法(getter方法沒有get字首)。

readwrite:預設屬性,將生成不帶額外引數的getter和setter方法(setter方法只有一個引數)。

atomic:對於物件的預設屬性,就是setter/getter生成的方法是一個原子操作。如果有多個執行緒同時呼叫setter的話,不會出現某一個執行緒執行setter全部語句之前,另一個執行緒開始執行setter的情況,相關於方法頭尾加了鎖一樣。

nonatomic:不保證setter/getter的原子性,多執行緒情況下資料可能會有問題。

27.類變數的@protected ,@private,@public,@package宣告各有什麼含義

Objective-C 對存取許可權的設定。也是變數的作用域。
protected 該類和所有的子類中的方法可以直接訪問這樣的變數,這是預設的。
private — 該類中的方法可以訪問這樣的變數,子類不可以。 public — 除了自己和子類中的方法外,也可以被其他類或者其他模組中的方法所訪問。開放性最大。 package — 對於64點陣圖像,這樣的成員變數可以在實現這個類的影象中隨意訪問。

28.淺拷貝和深拷貝區別是什麼

簡單的來說就是,在有指標的情況下,淺拷貝只是增加了一個指標指向已經存在的記憶體,而深拷貝就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤
29.Cocoa中與虛基類的概念麼?怎麼簡潔的實現
30.NSString 和 NSMutableString 有什麼區別

NSString相當於一個const char* 不可以改變。 
而 NSMutableString相當於 char* 可以改變內部的內容。 


31.自動釋放池跟GC有什麼區別?iPhone上有GC麼?[pool release] 和[pool drain]有什麼區別 
”Autorelease Pools”(自動釋放池)在應用中的使用技巧。 1,Autorelease Pools概要 一個”Autorelease Pool”例項中“包含”其它各種呼叫了”autorelease”方法的物件。當它釋放時,其中所有被管理物件都會收到”relrease”的消信。注意,同一個物件可以被多次呼叫”autorelease”方法,並可以放到同一個”Autorelease Pool”中。引入這個自動釋放池機制,物件的”autorelease”方法代替”relrease”方法可以延長它的生命週期,直接到當前”Autorelrease Pool”釋放。如果想讓此物件的生命週期超過”Autorelease Pool”,還可以再次”retain”,呵呵,有意思吧?且讓我慢慢道來。 Cocoa總是認為當前至少有一個”Autorelease Pool”物件是可用的。若此物件並不存在,你呼叫的”autorelease”的所有物件都不會被自動釋放掉,可想而知,造成記憶體洩露。Cocoa把這個錯誤資訊寫入日誌??僅僅是為了以後分析。 你可以用”alloc”與”init”方法建立一個”NSAutoreleasePool”物件,並且可以呼叫”release”或”drain”(”release”與”drain”的區別是”drain”在有GC的環境中會引起GC回收操作,”release”反之。但在非GC環境中,兩者相同。官方的說法是為了程式的相容性,應該考慮用”drain”代替”release”,)方法來回收它(呼叫它的”autorelease”或”retain”方法會引起異常)。在一個完整的上下文最後”Autorelease Pool”物件應該被”release”掉(在方法內或一段迴圈體內建立的”Autorelease Pool”物件)。 “Autorelease Pools”的所有例項在棧中管理(我們暫時叫他“自動釋放池棧”),並且它們是可以被巢狀的(父生子,子生孫。。。子子孫孫 ^_^)。例如,當我們建立一個”Autorelease Pool”物件後,它就被自動放到“自動釋放池棧”的棧頂。當本池物件回收時,它就隨之從這個棧中POP掉。那麼也就是說,當任何一個物件呼叫”autorelease”方法後,它會被放入當前執行緒中當前棧頂的自動釋放池中。 接下來我們聊聊”Autorelease Pools”的巢狀問題。在你的應用中,你可以任意多的建立”Autorelease Pool”物件,而這些物件被當前執行緒的“自動釋放池棧”所管理。那麼除了一個接一個的順序建立並銷燬它的情況外,還有一種使用方式,就是巢狀式的建立與使用。例如:在你的主函式建立了一個”autorelease pool”,然後又呼叫了建立了”autorelease pool”例項的其它方法;或是在外迴圈中建立了”Autorelease Pool”的例項,而內迴圈中也做了相同的事情。有意思吧,呵呵,巢狀的機制使父Pool例項釋放後,它的所有子Pool也將釋放。但這裡還存在一些副作用,後續文章會詳細討論。 “Application kit”在一個事件迴圈裡會自動建立一個”autorelease pool”。像滑鼠鍵的按下與釋放,所以你編寫的程式碼通常不需要考慮太多這方面的事情。當然,有以下三種情況你會建立與銷燬自己的Pool例項:    1,應用不是基於”Application Kit”,像”Command-line tool”,因為它並沒有內建的”autorelease pools”的支援。    2,建立執行緒,你必需線上程開始時建立一個”Autorelease Pool”例項。反之,會造成記憶體池露(會在以後的文章詳細說明執行緒與池的技巧)。    3,一個迴圈內建立了太多的臨時物件,你應該為他們建立一個”Autorelease Pool”物件,並在下次循還前銷燬它們。 2,自動釋放池中的”Non-AppKit”應用 在”Non-AppKit”應用中使用自動釋放池的機制其實是相當簡單的事情。你僅僅需要在main()起始處建立”Autorelease Pool”物件,並在結尾處釋放掉它。就像在Xcode的Foundation Tool的建立模版裡寫的一樣。這個確保你在應用生命週期內至少有一個”Autorelease Pool”是可用的。但是,這也使所有在此期間的所有”autorelease”的物件都必需在應用結束後才被釋放。這也許會引起在應用的使用中不斷的增長,所以,你仍然考慮在不同的作用域建立新的”Autorelease Pool”。 大多應用中都存在各種級別的迴圈機制。在這些應用中,你可以在每個迴圈內的開頭建立一個”Autorelease Pool”物件,並在結尾處釋放掉它。 例如: void main() {     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];     NSArray *args = [[NSProcessInfo processInfo] arguments];     unsigned count, limit = [args count];     for (count = 0; count < limit; count++)     {         NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];         NSString *fileContents;         NSString *fileName;         fileName = [args objectAtIndex:count];         fileContents = [[[NSString alloc] initWithContentsOfFile:fileName] autorelease];         // this is equivalent to using stringWithContentsOfFile:                  [loopPool release];     }          [pool drain];     exit (EXIT_SUCCESS); } 在命令列中處理所有以引數傳來的檔案。一次迴圈處理一個檔案。在迴圈的開頭建立一個”NSAutoreleasePool”物件,並在迴圈結束時釋放掉。因此,任何在其中建立並呼叫“autorelease”的物件都將新增到這個Pool例項中,當本池被釋放後,這些物件也將被回收。注意,任何在作用域內建立的”autoreleased”物件(像”fileName”),雖然並沒有顯示的呼叫”autorelease”方法,但都將被當前池所管理並釋放。 


32.C和obj-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 
33.響應者鏈是什麼 響應者鏈是Application Kit事件處理架構的中心機制。它由一系列連結在一起的響應者物件組成,事件或者動作訊息可以沿著這些物件進行傳遞。如圖6-20顯示的那樣,如果一個響應者物件不能處理某個事件或動作-也就是說,它不響應那個訊息,或者不認識那個事件,則將該訊息重新傳送給鏈中的下一個響應者。訊息沿著響應者鏈向上、向更高階別的物件傳遞,直到最終被處理(如果最終還是沒有被處理,就會被拋棄)。
The responder chain 當Application Kit在應用程式中構造物件時,會為每個視窗建立響應者鏈。響應者鏈中的基本物件是NSWindow物件及其檢視層次。在檢視層次中級別較低的檢視將比級別更高的檢視優先獲得處理事件或動作訊息的機會。NSWindow中保有一個第一響應者的引用,它通常是當前視窗中處於選擇狀態的檢視,視窗通常把響應訊息的機會首先給它。對於事件訊息,響應者鏈通常以發生事件的視窗對應的NSWindow物件作為結束,雖然其它物件也可以作為下一個響應者被加入到NSWindow物件的後面。
34..UIscrollVew用到了什麼設計模式?還能再foundation庫中找到類似的嗎?
組合模式composition,所有的container view都用了這個模式
觀察者模式observer,所有的UIResponder都用了這個模式。
模板(Template)模式,所有datasource和delegate介面都是模板模式的典型應用


33. .timer的間隔週期準嗎?為什麼?怎樣實現一個精準的timer? 

NSTimer可以精確到50-100毫秒. 
NSTimer不是絕對準確的,而且中間耗時或阻塞錯過下一個點,那麼下一個點就pass過去了

1.Difference between shallow copy and deep copy?
淺複製和深複製的區別?

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

2.What is advantage of categories? What is difference between implementing a category and inheritance?
類別的作用?繼承和類別在實現中有何區別?

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

3.Difference between categories and extensions?
類別和類擴充套件的區別。

答案:category和extensions的不同在於 後者可以新增屬性。另外後者新增的方法是必須要實現的。
extensions可以認為是一個私有的Category。

4.Difference between protocol in objective c and interfaces in java?
obc中的協議和java中的介面概念有何不同?

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

5.What 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就行了,
可以按照kvc查詢的邏輯理解,就說的過去了。

6.What is purpose of delegates?
代理的作用?

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

7.What are mutable and immutable types in Objective C?
obc中可修改和不可以修改型別。

答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態新增修改和不可動態新增修改一樣。
比如NSArray和NSMutableArray。前者在初始化後的記憶體控制元件就是固定不可變的,後者可以新增等,可以動態申請新的記憶體空間。

8.When we call objective c is runtime language what does it mean?
我們說的obc是動態執行時語言是什麼意思?

答案:多型。 主要是將資料型別的確定由編譯時,推遲到了執行時。
這個問題其實淺涉及到兩個概念,執行時和多型。
簡單來說,執行時機制使我們直到執行時才去決定一個物件的類別,以及呼叫該類別物件指定方法。
多型:不同物件以自己的方式響應相同的訊息的能力叫做多型。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是呼叫是我們只需呼叫各自的eat方法。
也就是不同的物件以自己的方式響應了相同的訊息(響應了eat這個選擇器)。
因此也可以說,執行時機制是多型的基礎?~~~

9.what is difference between NSNotification and protocol?
通知和協議的不同之處?

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

10.What is push notification?
什麼是推送訊息?

11.Polymorphism?
關於多型性

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

12.Singleton?
對於單例的理解

答案:11,12題目其實出的有點泛泛的感覺了,可能說是程式語言需要或是必備的基礎。
基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你程式設計中碰到過運用的此種模式的框架類等。
進一步點,考慮下如何在多執行緒訪問單例時的安全性。

13.What is responder chain?
說說響應鏈

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

14.Difference between frame and bounds?
frame和bounds有什麼不同?

答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)
bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)

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

答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現.
詳情可以看apple文件。

16.Is there any garbage collection mechanism in Objective C.?
OBC的垃圾回收機制?

答案: OBC2.0有Garbage collection,但是iOS平臺不提供。
一般我們瞭解的objective-c對於記憶體管理都是手動操作的,但是也有自動釋放池。
但是差了大部分資料,貌似不要和arc機制搞混就好了。
求更多~~

17.NSOperation queue?

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

18.What is lazy loading?

答案:懶漢模式,只在用到的時候才去初始化。
也可以理解成延時載入。
我覺得最好也最簡單的一個列子就是tableView中圖片的載入顯示了。
一個延時載,避免記憶體過高,一個非同步載入,避免執行緒堵塞。

19.Can we use two tableview controllers on one viewcontroller?
是否在一個檢視控制器中嵌入兩個tableview控制器?

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

20.Can we use one tableview with two different datasources? How you will achieve this?
一個tableView是否可以關聯兩個不同的資料來源?你會怎麼處理?

答案:首先我們從程式碼來看,資料來源如何關聯上的,其實是在資料來源關聯的代理方法裡實現的。
因此我們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據自己的需要去設定如相關的資料來源。
因此,我覺得可以設定多個資料來源啊,但是有個問題是,你這是想幹嘛呢?想讓列表如何顯示,不同的資料來源分割槽塊顯示?

21.Object-c的類可以多重繼承麼?可以實現多個介面麼?重寫一個類的方式用繼承好還是分類好?為什麼?

Objective-c只支援單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這裡是用protocol 委託代理 來實現的。

22.#import 跟#include 又什麼區別 #import<> 跟 #import""又什麼區別?

答案:@class一般用於標頭檔案中需要宣告該類的某個例項變數的時候用到,在m文 件中還是需要使用#import而#import比起#include的好處就是不會引起交叉編譯。

23.類變數的@protected ,@private,@public,@package宣告各有什麼含義?

24.id 宣告的物件有什麼特性?

答案:id是個很重要的型別,是個可以指向任何型別的指標或者可以理解為指向任何未知型別的指標。

25.MVC是什麼?有什麼特性?為什麼在iPhone上被廣泛運用?

答案:MVC設計模式考慮三種物件:模型物件、檢視物件、和控制器物件。模型物件代表 特別的知識和專業技能,它們負責保有應用程式的資料和定義運算元據的邏輯。檢視物件知道如何顯示應用程式的模型資料,而且可能允許使用者對其進行編輯。控制 器物件是應用程式的檢視物件和模型物件之間的協調者。

26.對於語句NSString* testObject = [[NSData alloc] init];testObject 在編譯時和執行時分別是什麼型別的物件?

27.什麼是安全釋放?

28.為什麼有些4.0獨有的objective-c 函式在3.1上執行時會報錯.而4.0獨有的類在3.1上分配記憶體時不會報錯?分配的結果是什麼?

29.為什麼4.0獨有的c函式在3.1的機器上執行不會報錯(在沒有呼叫的情況下?)而4.0獨有的類名在3.1的機器上一執行就報錯?

30.異常exception 怎麼捕獲?不同的CPU結構上開銷怎樣?C中又什麼類似的方法?

31.property中屬性retain,copy,assgin的含義分別是什麼?有什麼區別?將其轉換成get/set方法怎麼做?有什麼注意事項?

32.委託是什麼?委託的property宣告用什麼屬性?為什麼?

34.Cocoa中有虛基類的概念麼?怎麼簡潔的實現?

35.自動釋放池跟GC(垃圾回收)有什麼區別?iPhone上有GC麼?[pool release] 和[pool drain]有什麼區別?

iPhone上沒有GC。iPhone開發的時候沒有垃圾回收機制。

在垃圾回收環境中,release是一個空操作。因此,NSAutoreleasePool提供了drain方法,在引用計數環境中,該方法的作用等同於呼叫release,但在垃圾回收環境中,它會觸發垃圾回收(如果自上次垃圾回收以來分配的記憶體大於當前的閾值)。因此,在通常情況下,您應該使用drain而不是release來銷燬自動釋放池。

36.

1
2
3
4
5
6
7
8
9
10
11
for(int index = 0; index < 20; index ++){
 
NSString *tempStr = @”tempStr”;
 
NSLog(tempStr);
 
NSNumber *tempNumber = [NSNumber numberWithInt:2];
 
NSLog(tempNumber);
 
}

這段程式碼有什麼問題.?會不會造成記憶體洩露(多執行緒)?在記憶體緊張的裝置上做大迴圈時自動釋放池是寫在迴圈內好還是迴圈外好?為什麼?

37.記憶體管理的幾條原則時什麼?按照預設法則.那些關鍵字生成的物件需要手動釋放?在和property結合的時候怎樣有效的避免記憶體洩露?

38.在一個物件釋放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove這個物件可能會出現什麼問題?

39.怎樣實現一個 singleton的類.給出思路。

40.什麼是序列化或者Acrchiving,可以用來做什麼,怎樣與copy結合,原理是什麼?.

41. 執行緒與程序的區別和聯絡?

答案: 程序和執行緒都是由作業系統所體會的程式執行的基本 單元,系統利用該基本單元實現系統對應用的併發性。

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

42.在iphone上有兩件事情要做,請問是在一個執行緒裡按順序做效率高還是兩個執行緒裡做效率高?為什麼?

43.runloop是什麼?在主執行緒中的某個函式裡呼叫了非同步函式,怎麼樣block當前執行緒,且還能響應當前執行緒的timer事件,touch事件等.

44.ios平臺怎麼做資料的持久化?coredata和sqlite有無必然聯絡?coredata是一個關係型資料庫嗎?

iOS中可以有四種持久化資料的方式: 屬性列表、物件歸檔、SQLite3和Core Data;core data可以使你以圖形介面的方式快速的定義app的資料模型,同時在你的程式碼中容易獲取到它。core data提供了基礎結構去處理常用的功能,例如儲存,恢復,撤銷和重做,允許你在app中繼續建立新的任務。在使用core data的時候,你不用安裝額外的資料庫系統,因為core data使用內建的sqlite資料庫。core data將你app的模型層放入到一組定義在記憶體中的資料物件。core data會追蹤這些物件的改變,同時可以根據需要做相反的改變,例如使用者執行撤銷命令。當core data在對你app資料的改變進行儲存的時候,core data會把這些資料歸檔,並永久性儲存。

mac os x中sqlite庫,它是一個輕量級功能強大的關係資料引擎,也很容易嵌入到應用程式。可以在多個平臺使用,sqlite是一個輕量級的嵌入式sql資料庫程式設計。與core data框架不同的是,sqlite是使用程式式的,sql的主要的API來直接運算元據表。

Core Data不是一個關係型資料庫,也不是關係型資料庫管理系統(RDBMS)。雖然Core Dta支援SQLite作為一種儲存型別,但它不能使用任意的SQLite資料庫。Core Data在使用的過程種自己建立這個資料庫。Core Data支援對一、對多的關係。

45.闡述一個nil物件從interface bulider產生,到載入程式執行空間,最後被釋放時所經歷的生命週期.

47.kvc是什麼?kvo是什麼?有什麼特性?

48.響應者鏈是什麼?

49.unix上程序怎麼通訊?

UNIX主要支援三種通訊方式:

  1. 基本通訊:主要用來協調程序間的同步和互斥

  (1)鎖檔案通訊

    通訊的雙方通過查詢特定目錄下特定型別的檔案(稱鎖檔案)來完成程序間  對臨界資源訪問時的互斥;例如程序p1訪問一個臨界資源,首先檢視是否有一個特定型別檔案,若有,則等待一段時間再查詢鎖檔案。

  (2)記錄鎖檔案

  2. 管道通訊:適應大批量的資料傳遞

  3. IPC    :適應大批量的資料傳遞

50.timer的間隔週期準嗎?為什麼?怎樣實現一個精準的timer?

51.UIscrollVew用到了什麼設計模式?還能再foundation庫中找到類似的嗎?(答案眾多,不知道哪個是對的~~)

模板(Template)模式,所有datasource和delegate介面都是模板模式的典型應用,

組合模式composition,所有的containerview都用了這個模式

觀察者模式observer,所有的UIResponder都用了這個模式。

52如果要開發一個類似eclipse的軟體,支援外掛結構。且開放給第三方開發。你會怎樣去設計它?(大概思路)

53. 

1
2
3
4
5
6
7
8
9
10
11
main()
 
{
 
 int a[5]={1,2,3,4,5};
 
 int *ptr=(int *)(&a+1);
 
 printf("%d,%d",*(a+1),*(ptr-1));
 
}

答:2,5

  *(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2.5
,&a+1不是首地址+1,系統會認為加一個a陣列的偏 移,是偏移了一個陣列的大小(本例是5個int,int *ptr=(int *)(&a+1);
則ptr實際 是&(a[5]),也就是a+5
原因如下:

&a是陣列指標,其型別為 int (*)[5];
而指標加1要根據指標型別加上一定的值,不同型別的指標+1之後增加的大小不同。a是長度為5的int陣列指標,所以要加 5*sizeof(int)所以ptr實際是a[5],但是prt與(&a+1)型別是不一樣的(這點很重要),所以prt-1只會減去sizeof(int*),a,&a的地址是一樣的,但意思不一樣,a是陣列首地址,也就是a[0]的地址,&a是物件(陣列)首地址,a+1是陣列下一元素的地址,即a[1],&a+1是下一個物件的地址,即a[5].

54. 以下為Windows NT下的32位C++程式,請計算sizeof的值

voidFunc ( char str[100] )  
{  
  sizeof( str ) =?  
}  
void *p = malloc( 100 ); 
sizeof ( p ) = ?

答案:這題 很常見了,Func( char str[100] )函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是一個指標;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺下,指標的長度(佔用記憶體的大小)為4位元組,故sizeof( str ) 、sizeof( p ) 都為4。

55.

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)*getNSString(const NSString *inputString)
 
{    inputString [email protected]"This is a main test\n";
 
    return ;}
 
-main(void)
 
{NSString *[email protected]"Main";
 
NSString *aString = [NSStringstringWithString:@"%@",getNSString(a)];
 
NSLog(@"%@\n", aString);}

最後問輸出的字串:NULL,output在 函式返回後,記憶體已經被釋放。

56.列舉幾種程序的同步機制,並比較其優缺點。

答案:  原子操作訊號量機制    自旋鎖    管程,會合,分散式系統

程序之間通訊的途徑

答案:共享儲存系統訊息傳遞系統管道:以檔案系統為基礎

程序死鎖的原因

答案:資源競爭及程序推進順序非法

死鎖的4個必要條 件

答案:互斥、請求保持、不可剝奪、環路

死鎖的處理

答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖

57.堆和棧的區別

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

申請大小:
棧:在Windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

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

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

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

58.什麼是鍵-值,鍵路徑是什麼?

模型的性質是通過一個簡單的鍵(通常是個字串)來指定的。檢視和控制器通過鍵來查詢相應的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的資料型別。鍵-值編碼技術用於進行這樣的查詢—它是一種間接訪問物件屬性的機制。

鍵路徑是一個由用點作分隔符的鍵組成的字串,用於指定一個連線在一起的物件性質序列。第一個鍵的
性質是由先前的性質決定的,接下來每個鍵的值也是相對於其前面的性質。鍵路徑使您可以以獨立於模型
實現的方式指定相關 物件的性質。通過鍵路徑,您可以指定物件圖中的一個任意深度的路徑,使其指向相
關物件的特定屬性。

59.c和obj-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.

60.目標-動作機制

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

動作是控制元件傳送給目標的訊息,或者從目標的角度看,它是目標為了響應動作而實現的方法。

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

61.cocoatouch框架

iPhoneOS 應用程式的基礎Cocoa Touch 框架重用了許多 Mac 系統的成熟模式,但是它更多地專注於觸控的介面和優化。UIKit 為您提供了在 iPhone OS 上實現圖形,事件驅動程式的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,包括檔案處理,網路,字串操作等。

CocoaTouch 具有和 iPhone 使用者介面一致的特殊設計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形介面控制元件,按鈕,以及全屏檢視的功能,您還可以使用加速儀和多點觸控手勢來控制您的應用。

各色俱全的框架 除了UIKit 外,Cocoa Touch 包含了建立世界一流iPhone 應用程式需要的所有框架,從三維圖形,到專業音效,甚至提供裝置訪問 API 以控制攝像頭,或通過 GPS 獲知當前位置。Cocoa Touch 既包含只需要幾行程式碼就可以完成全部任務的強大的 Objective-C 框架,也在需要時提供基礎的 C 語言 API 來直接訪問系統。這些框架包括:

CoreAnimation

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

CoreAudio

CoreAudio 是播放,處理和錄製音訊的專業技術,能夠輕鬆為您的應用程式新增強大的音訊功能。

CoreData

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

功能列表:框架分類

下面是 CocoaTouch 中一小部分可用的框架:

•   音訊和視訊

•   Core Audio

•   OpenAL

•  Media Library

•   AV Foundation

•   資料管理

•   Core Data

•   SQLite

•   圖形和動畫

•   Core Animation

•   OpenGL ES

•   Quartz 2D

•   網路/li>

•   Bonjour

•   WebKit

•   BSD Sockets

•   使用者應用

•   Address Book

•   Core Location

•   Map Kit

•   Store Kit

62.objc的記憶體管理

如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來建立物件,您就擁
有這個物件,需要負責該物件的釋放。這個規則在使用NSObject的便利方法new 時也同樣適用.

如果您拷貝一個物件,您也擁有拷貝得到的物件,需要負責該物件的釋放.

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

如果您從其它物件那裡接收到一個物件,則您不擁有該物件,也不應該釋放它(這個規則有少數
的例外,在參考文件中有顯式的說明)。

63.自動釋放池是什麼,如何工作

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

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

64.類工廠方法是什麼

類工廠方法的實現是為了向客戶提供方便,它們將分配和初始化合在一個步驟中, 返回被建立的物件,並
進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何字首)。

工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對
象的分配資訊。

類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件例項。雖 然init...方法可以確認一
個類在每次程式執行過程只存在一個例項,但它需要首先分配一個“生的”例項,然後還必須釋放該例項。
工廠 方法則可以避免為可能沒有用的物件盲目分配記憶體。

65.單件例項是什麼

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

66.動態繫結—在執行時確定要呼叫的方法

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

特別是當訊息的接收者是動態型別已經確定的物件時,動態繫結就會例行而 透明地發生。

67.obj-c的優缺點

objc優點:
  1)Cateogies 
  2) Posing 
  3) 動態識別
  4) 指標計算 
  5)彈性訊息傳遞
  6) 不是一個過度複雜的 C 衍生語言
  7) Objective-C 與 C++ 可混合程式設計

缺點: 
  1) 不支援名稱空間 
  2)  不支援運算子過載

 3) 不支援多重繼承

 4) 使用動態執行時型別,所有的方法都是函式呼叫,所以很多編譯時優化方法都用不到。(如行內函數等),效能低劣。

68.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,非原子性訪問,不加同步, 多執行緒併發訪問會提高效能。注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。鎖被加到所屬物件例項級(我是這麼理解的…)。

69.ViewController的 didReceiveMemoryWarning 是在什麼時候被呼叫的?(87題)

70.談談你對ARC 的認識和理解?

71.  ObjC中,與alloc語義相反的方法是dealloc還是release?與retain語義相反的方法是dealloc還是release,為什麼?需要與alloc配對使用的方法是dealloc還是release,為什麼?

alloc與dealloc語意相反,alloc是建立變數,dealloc是釋放變數。 retain 對應release,retain 保留一個物件。呼叫之後,變數的計數加1。或許不是很明顯,在這有例為證:            

1
2
3
4
5
6
7
- (void)setName : (NSString*) name {
 
   [name retain];
 
   [myname release];
 
   myname = name; }<span style="line-height:1.5;font-family:'sans serif', tahoma, verdana, helvetica;font-size:10pt;">  </span>

我們來解釋一下:設想,使用者在呼叫這個函式的時候,他注意了記憶體的管理,所以他小心的寫了如下程式碼:

1
2
3
4
5
NSString* newname = [[NSString alloc] initWithString: @"John"];
 
[aClasssetName: newname];
 
[newnamerelease];

我們來看一看newname的計數是怎麼變化的。首先,它被alloc,count = 1; 然後,在setName中,它被retain,count = 2; 最後,使用者自己釋放newname,count= 1,myname指向了newname。這也解釋了為什麼需要呼叫[myname release]。我們需要在給myname賦新值的時候,釋放掉以前老的變數。retain 之後直接dealloc物件計數器沒有釋放。alloc 需要與release配對使用,因為alloc 這個函式呼叫之後,變數的計數加1。所以在呼叫alloc 之後,一定要呼叫對應的release。另外,在release一個變數之後,他的值仍然有效,所以最好是後面緊接著再var = nil。

72.  在一個物件的方法裡面:

self.name<http://self.name/> = “object”;

name =”object”

有什麼不同?

73.  這段程式碼有什麼問題:

1
2
3
4
5
6
7
8
9
@implementation Person
 
- (void)setAge:(int)newAge {
 
self.age = newAge;
 
}
 
@end

74.  什麼是retaincount?

75.  以下每行程式碼執行後,person物件的retain count分別是多少

1
2
3
4
5
6
7
Person *person = [[Person alloc] init];
 
[person retain];
 
[person release];
 
[person release];

76.  為什麼很多內建類如UITableViewController的delegate屬性都是assign而不是retain的?

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

assign用於簡單資料型別,如NSInteger,double,bool,retain和copy使用者物件,copy用於當 a指向一個物件,b也想指向同樣的物件的時候,如果用assign,a如果釋放,再呼叫b會crash,如果用copy 的方式,a和b各自有自己的記憶體,就可以解決這個問題。retain 會使計數器加一,也可以解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函式會變成下面這樣:

1
if(property != newValue) {       [propertyrelease];       property = [newValueretain];   }

78. autorelease的物件是在什麼時候被release的?

答:autorelease實際上只是把對release的呼叫延遲了,對於每一個Autorelease,系統只是把該Object放入了當前的Autoreleasepool中,當該pool被釋放時,該pool中的所有Object會被呼叫Release。對於每一個Runloop,系統會隱式建立一個Autoreleasepool,這樣所有的releasepool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autoreleasepool會被銷燬,這樣這個pool裡的每個Object(就是autorelease的物件)會被release。那什麼是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。那什麼是一個Runloop呢?一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。

79.  這段程式碼有什麼問題,如何修改

1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < someLargeNumber; i++)
 
{
 
NSString *string = @”Abc”;
 
string = [string lowercaseString];
 
string = [stringstringByAppendingString:@"xyz"];
 
NSLog(@“%@”, string);
 
}

80. autorelease和垃圾回收機制(gc)有什麼關係?IPhone OS有沒有垃圾回收(gc)?

81. Objective C中的protocal是什麼?

@protocal obj裡面的協議就如同java裡面的interface。

82. Objective C中的selector 是什麼?

你可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言的中函式指標,只不過C語言中,可以把函式名直接賦給一個函式指標,而Objective-C的類不能直接應用函式指標,這樣只能做一個@selector語法來取.它的結果是一個SEL型別。這個型別本質是類方法的編號(函式地址)。

83. Objective C中的category是什麼?

Objective-C提供了一個非常靈活的類(Class)擴充套件機制-類別(Category)。類別用於對一個已經存在的類新增方法(Methods)。你只需要知道這個類的公開介面,不需要知道類的原始碼。需要注意的是,類別不能為已存在的類新增例項變數(Instance Variables)。

子類(subclassing)是進行類擴充套件的另一種常用方法。與子類相比,類別最主要的優點是:系統中已經存在的類可以不需修改就可使用類別的擴充套件功能。

類別的第二大優點是實現了功能的區域性化封裝。類別定義可以放在一個已存在的類(類A)的定義檔案中(.h)。這意味著這個類別只有在類A被引用的前提下才會被外部看到。如果另一個類(類B)不需要用到類A的功能(沒有包含類A的.h檔案),也就不會看到依附類A存在的類別。iOS SDK中廣泛運用這種類別定義法來封裝功能。

84. 什麼是Notification?什麼時候用delegate,什麼時候用Notification?

觀察者模式,controller向defaultNotificationCenter新增自己的notification,其他類註冊這個notification就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者預設隨機順序發通知給觀察者們,而且每個觀察者都要等當前的某個觀察者的操作做完才能輪到他來操作,可以用NotificationQueue的方式安排觀察者的反應順序,也可以在新增觀察者中設定反映時間,取消觀察需要在viewDidUnload跟dealloc中都要登出)。

delegate針對one-to-one關係,並且reciever可以返回值給sender,notification可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用於sender希望接受到reciever的某個功能反饋值,

notification用於通知多個object某個事件。

85. 什麼是KVC和KVO?Notification和KVO有什麼不同?KVO在ObjC中是怎麼實現的?

86. ViewController 的 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 。

87. ViewController 的didReceiveMemoryWarning 是在什麼時候被呼叫的?UIViewController類中didReceiveMemoryWarning預設的操作是什麼?

答:預設呼叫[superdidReceiveMemoryWarning]

88. UITableViewController 中,建立UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什麼用?簡述UITableViewCell的複用原理.

複用佇列的元素增加:只有在cell被滑動出介面的時候,此cell才會被加入到複用佇列中。每次在建立cell的時候,程式會首先通過呼叫dequeueReusableCellWithIdentifier:cellType方法,到複用佇列中去尋找標示符為“cellType”的cell,如果找不到,返回nil,然後程式去通過呼叫[[[UITableViewCell alloc]initWithStyle:style reuseIdentifier:cellType] autorelease]來建立標示符為“cellType”的cell。

89. UIView 和CALayer 有什麼區別?

兩者最大的區別是,圖層不會直接渲染到螢幕上。

90. 以 UIView 類animateWithDuration:animations: 為例,簡述UIView動畫原理。

第一篇面試題整理:

http://www.cocoachina.com/bbs/read.php?tid-459620.html

本篇面試題同樣:如答案有問題,歡迎指正!

1.回答person的retainCount值,並解釋為什麼

Person * per = [[Person alloc] init];

self.person = per;

2.這段程式碼有什麼問題嗎:

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge;

}

@end

正確寫法

{

if(_age){

[_age release];

}

_age = [newAge retain];

}

死迴圈(擴充套件:知道如何正確寫setter和getter方法)

3.這段程式碼有什麼問題,如何修改

for (int i = 0; i < someLargeNumber; i++) { 

NSString *string = @”Abc”;//常量區

string = [string lowercaseString];//新的堆區

string = [string stringByAppendingString:@"xyz"];//新的堆區

NSLog(@“%@”, string);

}

在for迴圈裡新增自動釋放池(擴充套件:常量區的retaincount是怎麼個情況)

4.擷取字串”20 | http://www.baidu.com”中,”|”字元前面和後面的資料,分別輸出它們。

componentsSeparatedByString

NSString * str = @“20|http://www.baidu.com”;

for(NSString*s in [str componentsSeparatedByString]){

NSLog(@“%@“,s);

}

5.用obj-c寫一個氣泡排序

1
2
3
4
5
6
7
8
for(int i = 0, i < arr.count - 1,i++){
for (int j = 0,j < arr.count - 1 - i;j++){
int a = [[arr objectAtIndex:j]intValue];
int b=[[arr objectAtIndex:j+1]intValue];
if(a < b){
[arr replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@“%d”,b]];
[arr replaceObjectAtIndex:j+1 withObject:[NSString stringWithFormat:@“%d”,a];
}}}

6.簡述你對UIView、UIWindow和CALayer的理解

http://blog.csdn.net/kuqideyupian/article/details/7731942

http://o0o0o0o.iteye.com/blog/1728599

7.寫一個完整的代理,包括宣告,實現

注意手寫的準確性

8.分析json、xml的區別?json、xml解析方式的底層是如何處理的?

http://www.open-open.com/bbs/view/1324367918671

http://hi.baidu.com/fevelen/item/a25253ab76f766756cd455b6

9.ViewController 的 didReceiveMemoryWarning 是在什麼時候被呼叫的?預設的操作是什麼?

http://blog.sina.com.cn/s/blog_68661bd80101nn6p.html

10.物件導向的三大特徵,並作簡單的介紹

封裝、繼承、多型

多型:父類指標指向子類物件。兩種表現形式:重寫(父子類之間)和過載(本類中)

OC的多型體現是:重寫,沒有過載這種表現形式

舉例說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@interface Parent : NSObject    //父類
- (void)simpleCall;
@end 
@interface Child_A : Parent   //子類  Child_A
@end 
@implementation Child_A
- (void)simpleCall
{
    NSLog(@"我是Child_A的simpleCall方法");
}
@end
@interface Child_B : Parent     //子類Child_B
@end
- (void)simpleCall
{
     NSLog(@"我是Child_的simpleCall方法");
}
@end

然後,我們就可以看到多型所展示的特性了:

1
2
3
4
Parent * pa=[[Child_A alloc] init];// 父類指標指向子類Child_A物件
Parent * pb=[[Child_B alloc] init]; //父類指標指向子類Child_B物件
[pa simpleCall];// 顯然是呼叫Child_A的方法
[pb simpleCall];// 顯然是呼叫Child_B的方法

在OC中常看見的多型體現:

1
2
3
4
5
6
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
 {  
     static NSString *CellWithIdentifier = @"Cell";  
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];  
      return cell;  
  }

(UITableViewCell *)指向cell子類物件

11.重寫一個NSString型別的,retain方式宣告name屬性的setter和getter方法

1
2
3
4
5
6
7
8
-(void)settetName:(NSString *)name{
if(_name){
[_name release];
}
 _name = [name retain];
}
-(NSString *)getterName{
          return [[_name retain]autorelease];

12.簡述NotificationCenter、KVC、KVO、Delegate?並說明它們之間的區別?

http://blog.csdn.net/zuoerjin/article/details/7858488

http://blog.sina.com.cn/s/blog_bf9843bf0101j5px.html

13.What is lazy loading?

懶漢模式,只在用到的時候才去初始化。也可以理解成延時載入。我覺得最好也最簡單的一個列子就是tableView中圖片的載入顯示了。一個延時載,避免記憶體過高,一個非同步載入,避免執行緒堵塞

14.什麼是Protocol?什麼是代理?寫一個委託的interface?委託的property宣告用什麼屬性?為什麼?

委託的property宣告用什麼屬性是assign(防止迴圈引用)

15.分別描述類別(categories)和延展(extensions)是什麼?以及兩者的區別?繼承和類別在實現中有何區別?為什麼Category只能為物件新增方法,卻不能新增成員變數?

考慮類目比繼承的優點

類別是把類的實現方法分散到不同的檔案中 也可以給類擴充套件新方法

延展是給類新增私有方法 只為自己類所見 所使用

繼承可以擴充套件例項變數 而類別不能

類別如果可以新增成員變數 就跟繼承沒什麼兩樣了  而且在上線的專案更新中 用類別筆繼承更能維護專案的穩定性

16.Objective-C有私有方法麼?私有變數呢?如多沒有的話,有沒有什麼代替的方法?

oc沒有私有方法 但是有私有變數@property  私有方法可以用延展代替

17.#import、#include和@class有什麼區別

#import 系統檔案、自定義檔案引用 不用擔心重複引用的問題

#include 跟#import幾乎一樣 但是他需要注意不能重複引用

@class 只是告訴系統有這個類 但是如果在實現類中用到這個類 需要重新用#import匯入該類標頭檔案 

18.談談你對MVC的理解?為什麼要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其他的OC設計模式或別的設計模式嗎?

mvc - model view controller   避免了view與model 的強耦合 使程式碼更靈活 更容易維護 可複用 可擴充套件   oc其他設計模式有Notification 。target;action.  singleton delegate

19.如監測系統鍵盤的彈出

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];

擴充套件:ios 彈出鍵盤擋住UITextView的解決方式

20.舉出5個以上你所熟悉的ios  sdk庫有哪些和第三方庫有哪些?

AFWorking/WebKit/SQLite/Core Data/Address Book

21.如何將產品進行多語言釋出?

http://fengmm521.blog.163.com/blog/static/25091358201291645852889/

22.如何將敏感字變成**

1
2
3
4
5
search = @"某某某";
    replace = @“***”;
    range = [mstr rangeOfString:search];
    [mstr replaceCharactersInRange:range withString:replace];    
    NSLog(@"%@",mstr);

  

23.objc中的減號與加號代表什麼?

類方法

24.單例目的是什麼,並寫出一個?

避免重複建立  節省記憶體空間

1
2
3
4
5
6
7
8
static Model * model;
+(id)singleton{
if(!model){
 @synchronized(self){
model = [[Model alloc]init];
}}
return model;
}

25.說說響應鏈

http://www.tuicool.com/articles/6jmUje

從手指觸控式螢幕幕的地方的最上層控制元件是第一響應者,事件會沿著響應鏈一直向下傳遞直到被接受並作出處理