黑馬程序員——iOS面試題歸類整理(附詳細答案)——黑馬 ios 技術博客

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------


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

cocoa 中所有的類都是NSObject 的子類,多繼承在這裏是用protocol 委託代理來實現的
你不用去考慮繁瑣的多繼承 ,虛基類的概念.ood的多態特性
在 obj-c 中通過委託來實現.

Object-C有私有方法嗎?私有變量呢?

objective-c – 類裏面的方法只有兩種, 靜態方法和實例方法. 這似乎就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私有方法的話, 對於一些小範圍的代碼重用就不那麼順手了. 在類裏面聲名一個私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
– (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end

@private可以用來修飾私有變量
在Objective‐C中,所有實例變量默認都是私有的,所有實例方法默認都是公有的

關鍵字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 類型,以使得其返回值不爲”左值”。

關鍵字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 成員變量。

#import和#include的區別,@class代表什麼?

@class一般用於頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import
而#import比起#include的好處就是不會引起重複包含

線程和進程的區別?

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

堆和棧的區別?

管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程序員控制,容易產生memory leak。
申請大小:
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閒內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對於棧來講,則不會存在這個問題,因爲棧是先進後出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個內存塊從棧中間彈出
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

Object-C的內存管理?

1.當你使用new,alloc和copy方法創建一個對象時,該對象的保留計數器值爲1.當你不再使用該對象時,你要負責向該對象發送一條release或autorelease消息.這樣,該對象將在使用壽命結束時被銷燬.
2.當你通過任何其他方法獲得一個對象時,則假設該對象的保留計數器值爲1,而且已經被設置爲自動釋放,你不需要執行任何操作來確保該對象被清理.如果你打算在一段時間內擁有該對象,則需要保留它並確保在操作完成時釋放它.
3.如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數相等.

爲什麼很多內置的類,如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模式時,也要注意這點。

定義屬性時,什麼情況使用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];
}

對象是什麼時候被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

iOS有沒有垃圾回收?

Objective-C 2.0也是有垃圾回收機制的,但是隻能在Mac OS X Leopard 10.5 以上的版本使用。

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就可以正常重用了。

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還是繼續做它該做的事情

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中釋放這些引用。

 

列舉Cocoa中常見的集中多線程的實現,並談談多線程安全的幾種解決辦法,一般什麼地方會用到多線程?

NSOperation NSThread
@sychonized

怎麼理解MVC,在Cocoa中MVC是怎麼實現的?

MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。控制器對象是應用程序的視圖對象和模型對象之間的協調者。
ViewCotroller
Xib

delegate和notification區別,分別在什麼情況下使用?

KVC(Key-Value-Coding)
KVO(Key-Value-Observing)
理解KVC與KVO(鍵-值-編碼與鍵-值-監看)

當通過KVC調用對象時,比如:[self valueForKey:@"someKey"]時,程序會自動試圖通過幾種不同的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。

(Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)

設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最後的機會響應這個請求。

self.跟self什麼區別?
id、nil代表什麼?

id

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

nil

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

內存管理 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的)

類別的作用?

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

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

委託(舉例)

委託代理(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之間可以通過委託來傳值!

下面這個例子委託有兩類:
1、一個視圖類對象的代理對象爲父視圖,子視圖用代理實現讓父視圖顯示別的子視圖
2、同一父視圖下的一個子視圖爲另一個子視圖的代理對象,讓另一個子視圖改變自身背景色爲給定的顏色
===============================================
規範格式如下:
@protocol TransparendValueDelegate;

@interface A:UIView
id< TransparendValueDelegate > m_dTransparendValueDelegate;
@property(nomatic, retain) id m_dTransparendValueDelegate;
@end
//代理協議的聲明
@protocol TransparendValueDelegat<NSObject>
{
-(void)transparendValue:(NSString*)fromValue;
}

frame 和 bounds 的 區別 ,bound的大小改變frame 改變嗎?

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

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

1。簡述push原理,push的證書和其它的右什麼不一樣?

2。sqlite中插入特殊字符的方法和接收到處理方法。

3。談談你對數組和連表認識,還有你是怎麼用他們的?

4。冒泡算法。

5。socket編程簡述

6。asihttp代碼原理 ,異步請求的原理,異步請求最大數目,爲什麼只能這麼多?

異步請求最大數目,爲什麼只能這麼多?

這個數量是跟cpu有關的,併發性取決於cpu核數,每個核只能同時處理一個任務.4核cpu理論上可以併發處理4個任務,如果按http來算就是4個請求,但是cpu是搶佔式資源,所以一般來說併發量是要根據任務的耗時和cpu的繁忙度來計算4個左右只是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不同的- -..一般來說估算這個量的最大效率估算公示是cpu核數*2-1,這個公式是當時對集羣進行壓測得到的結論.cpu搶佔時間跟任務時長…開啓這個數量的線程可以最大化的榨乾cpu。一個道理。cpu不可能都被搶去做connection.iOS是cpu密集型的消耗
。這個大概知道就行了,也不會有人特別在意吧…cpu核數*2-1那個是做淘寶的java團隊壓測得到的線程最優數
,放在iOS上也多少適用…一般來說不超過這個量就好,線程不是起的越多越好,線程數就是…cpu來決定的

7。http請求方式?

Get post put 還有是什麼來着忘了

8。uiview的圓角屬性設置方法。
(m_mainImgView.layer.cornerRadius = 6;
m_mainImgView.layer.masksToBounds = YES;)

9。 masksToBounds屬性的作用。(決定子layer是否被當前layer的邊界剪切。默認是NO。)

8.iOS程序運行流程{

1. 系統調用app的main函數

2. main函數調用UIApplicationMain.

3. UIApplicationMain創建shared application instance, UIApplication默認的instance.

4. UIApplicationMain讀取Info.plist找到主nib文件, 加載nib,把shared application instance 設爲nib的owner.

5. 通過nib文件,創建app的獨立UIWindows object.

6. 通過nib,實例化了程序的AppDelegate object.

7. app內部啓動結束,application:didFinishLaunchingWith- Options: 被設定成 wAppDelegate instance.

8. AppDelegate向UIWindow instance發makeKeyAndVisible消息, app界面展示給用戶. app準備好接收用戶的操作指令.

9. 內存管理的方式有哪些?

手動管理 ARC GC

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

這個自己寫一段單例的代碼吧

 

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

12.在iphone上有兩件事情要做,請問是在一個線程裏按順序做效率高還是兩個線程裏做效率高?爲什麼?

13.runloop是什麼?在主線程中的某個函數裏調用了異步函數,怎麼樣block當前線程,且還能響應當前線程的timer事件,touch事件等.

14.ios平臺怎麼做數據的持久化?coredata和sqlite有無必然聯繫?coredata是一個關係型數據庫嗎?

15.闡述一個nil對象從interface bulider產生,到載入程序運行空間,最後被釋放時所經歷的生命週期.

16.notification是同步還是異步? kvo是同步還是異步?notification是全進程空間的通知嗎?kvo呢?

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

18.響應者鏈是什麼?

19.unix上進程怎麼通信?

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

21.UIscrollVew用到了什麼設計模式?還能再foundation庫中找到類似的嗎?

22.如果要開發一個類似eclipse的軟件,支持插件結構。且開放給第三方開發。你會怎樣去設計它?(大概思路)

23.C和obj-c 如何混用?

24.以下每行代碼執行後,person對象的retain count分別是多少
Person *person = [[Person alloc] init]; // count 1
[person retain]; // count 2
[person release]; //count 1
[person release]; //retain count = 1;

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

內存出現警告時。

26.ios5新特性有那些?

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

這個我說不好,怕說錯了。在成了誤導還是自己上網查吧。

28.
View和CALayer的區別?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章