1.DFS 和BFS 的區(qū)別及其使?用場(chǎng)景?
http://blog.csdn.net/lulipeng_cpp/article/details/7524133
http://blog.csdn.net/alalalalalqp/article/details/9155419
DFS:深度搜索,決策搜索,深度優(yōu)先遍歷(depth-first search)。
基本思想:首先從圖中某個(gè)頂點(diǎn)v0出發(fā),訪問(wèn)此頂點(diǎn),然后依次從v0相鄰的頂點(diǎn)出發(fā)深度優(yōu)先遍歷,直至圖中所有與v0路徑相通的頂點(diǎn)都被訪問(wèn)了;若此時(shí)尚有頂點(diǎn)未被訪問(wèn),則從中選一個(gè)頂點(diǎn)作為起始點(diǎn),重復(fù)上述過(guò)程,直到所有的頂點(diǎn)都被訪問(wèn)??梢钥闯錾疃葍?yōu)先遍歷是一個(gè)遞歸的過(guò)程。
如圖:

其深度優(yōu)先遍歷得到的序列為:
0->1->3->7->4->2->5->6
BFS:廣度搜索,價(jià)值搜索,廣度優(yōu)先遍歷(breadth-first search)。
基本思想:首先,從圖的某個(gè)頂點(diǎn)v0出發(fā),訪問(wèn)了v0之后,依次訪問(wèn)與v0相鄰的未被訪問(wèn)的頂點(diǎn),然后分別從這些頂點(diǎn)出發(fā),廣度優(yōu)先遍歷,直至所有的頂點(diǎn)都被訪問(wèn)完。
如上面圖中
其廣度優(yōu)先遍歷得到的序列為:
0->1->2->3->4->5->6->7
BFS一般用來(lái)搜索最短路徑最好,DFS用來(lái)搜索能不能到達(dá)目的地之類的。
2.通知中?心和代理的區(qū)別?
在IOS應(yīng)用不斷的出現(xiàn)三種模式來(lái)實(shí)現(xiàn)這種通信:
1.委托delegation;A VC有點(diǎn)活自己不方便做,找B VC做,為了能完工包質(zhì)量必須有個(gè)協(xié)議。
delegate方法往往需要關(guān)注返回值,效率肯定是delegate比NSNotification高。
delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要關(guān)注返回值, 也就是delegate方法的結(jié)果。比如-windowShouldClose:,需要關(guān)心返回的是yes還是no。所以delegate方法往往包含 should這個(gè)很傳神的詞。也就是好比你做我的delegate,我會(huì)問(wèn)你我想關(guān)閉窗口你愿意嗎?你需要給我一個(gè)答案,我根據(jù)你的答案來(lái)決定如何做下一 步。相反的,notification最大的特色就是不關(guān)心接受者的態(tài)度, 我只管把通告放出來(lái),你接受不接受就是你的事情,同時(shí)我也不關(guān)心結(jié)果。所以notification往往用did這個(gè)詞匯,比如 NSWindowDidResizeNotification,那么nswindow對(duì)象放出這個(gè)notification后就什么都不管了也不會(huì)等待接 受者的反應(yīng)。
2.通知中心Notification Center;
notification最大的特色就是不關(guān)心接受者的態(tài)度。
這里的通知不是由被觀察者發(fā)出,而是由NSNotificationCenter來(lái)統(tǒng)一發(fā)出,而不同通知通過(guò)唯一的通知標(biāo)識(shí)名notificationName來(lái)區(qū)分,標(biāo)識(shí)名由發(fā)送通知的類來(lái)起。首先被觀察者自己在必要的方法A里,通過(guò)方法postNotificationName:object:來(lái)發(fā)出通知notificationName這樣發(fā)送通知者這邊的工作就完成了,每次A被調(diào)用,就會(huì)發(fā)送一次通知notificationName。然后誰(shuí)要監(jiān)聽A的變化,就通過(guò)[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:為觀察者注冊(cè)監(jiān)聽name為notificationName的通知然后每次發(fā)出name為notificationName的通知時(shí),注冊(cè)監(jiān)聽后的觀察者就會(huì)調(diào)用其自己定義的方法notificationSelector來(lái)進(jìn)行響應(yīng)。NSNotification的特點(diǎn)呢,就是需要被觀察者先主動(dòng)發(fā)出通知,然后觀察者注冊(cè)監(jiān)聽后再來(lái)進(jìn)行響應(yīng),比KVO多了發(fā)送通知的一步,但是其優(yōu)點(diǎn)是監(jiān)聽不局限于屬性的變化,還可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽,監(jiān)聽范圍廣,使用也更靈活。
3.鍵值觀察key value observing,KVO
KVO和delegate一樣,KVO和NSNotification的作用也是類與類之間的通信,與delegate不同的是1)這兩個(gè)都是負(fù)責(zé)發(fā)出通知,剩下的事情就不管了,所以沒有返回值;2)delegate只是一對(duì)一,而這兩個(gè)可以一對(duì)多。這兩者也有各自的特點(diǎn)。
被觀察者發(fā)出addObserver:forKeyPath:options:context:方法來(lái)添加觀察者。
然后只要被觀察者的keyPath值變化(注意:?jiǎn)渭兏淖兤渲挡粫?huì)調(diào)用此方法,只有通過(guò)getters和setters來(lái)改變值才會(huì)觸發(fā)KVO),就會(huì)在觀察者里調(diào)用方法observeValueForKeyPath:ofObject:change:context:
因此觀察者需要實(shí)現(xiàn)方法observeValueForKeyPath:ofObject:change:context:來(lái)對(duì)KVO發(fā)出的通知做出響應(yīng)。
這 些代碼都只需在觀察者里進(jìn)行實(shí)現(xiàn),被觀察者不用添加任何代碼,所以誰(shuí)要監(jiān)聽誰(shuí)注冊(cè),然后對(duì)響應(yīng)進(jìn)行處理即可,使得觀察者與被觀察者完全解耦,運(yùn)用很靈活很 簡(jiǎn)便;但是KVO只能檢測(cè)類中的屬性,并且屬性名都是通過(guò)NSString來(lái)查找,編譯器不會(huì)幫你檢錯(cuò)和補(bǔ)全,純手敲所以比較容易出錯(cuò)。
Delegate即為代理,也就是我自己的事情找代理做,我只負(fù)責(zé)method call,implementation交給代理
Protocol 為協(xié)議,可以理解為是在代理時(shí)與代理溝通的協(xié)議,定義了函數(shù)。
interface為接口,可以理解為當(dāng)前類對(duì)于其他類可見的部分。如#include之后,其他類可以使用的變量及函數(shù)等等。
3.weak 和strong 的區(qū)別 ,什么時(shí)候使?用到weak ,引?用循環(huán)( retain cycle )是怎樣產(chǎn)?生的?
strong與weak是由ARC新引入的對(duì)象變量屬性.xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。xcode 4.3(ios5和以上版本)之后就有了ARC,并且開始使用 strong與weak.
assign: 用于非指針變量。用于基礎(chǔ)數(shù)據(jù)類型 (例如NSInteger)和C數(shù)據(jù)類型(int, float, double, char, 等),另外還有id
如:
@property (nonatomic, assign) int number;
@property (nonatomic, assign) id className;//id必須用assign
反正記?。呵懊娌恍枰?“*” 的就用assign吧
weak and strong property (強(qiáng)引用和弱引用的區(qū)別):
1、 weak 和 strong 屬性只有在你打開ARC時(shí)才會(huì)被要求使用,這時(shí)你是不能使用retain release autorelease 操作的,因?yàn)锳RC會(huì)自動(dòng)為你做好這些操作,但是你需要在對(duì)象屬性上使用weak 和strong,其中strong就相當(dāng)于retain屬性,而weak相當(dāng)于assign。
2、只有一種情況你需要使用weak(默認(rèn)是strong),就是為了避免retain cycles(就是父類中含有子類{父類retain了子類},子類中又調(diào)用了父類{子類又retain了父類},這樣都無(wú)法release)
3、聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針。
ARC(Automatic Reference Counting):
1、就是代碼中自動(dòng)加入了retain/release,原先需要手動(dòng)添加的用來(lái)處理內(nèi)存管理的引用計(jì)數(shù)的代碼可以自動(dòng)地由編譯器完成了。
該機(jī)能在 iOS 5/ Mac OS X 10.7 開始導(dǎo)入,利用 Xcode4.2 以后可以使用該特性。
strong,weak,copy 具體用法:
1.具體一點(diǎn):IBOutlet可以為weak,NSString為copy,Delegate一般為weak,其他的看情況。一般來(lái)說(shuō),類“內(nèi)部”的屬性設(shè)置為strong,類“外部”的屬性設(shè)置為weak。說(shuō)到底就是一個(gè)歸屬權(quán)的問(wèn)題。小心出現(xiàn)循環(huán)引用導(dǎo)致內(nèi)存無(wú)法釋放。
2.不用ARC的話就會(huì)看到很多retian。
3.如果你寫了@synthesize abc = _abc;的話,系統(tǒng)自動(dòng)幫你聲明了一個(gè)_abc的實(shí)例變量。
使用assign: 對(duì)基礎(chǔ)數(shù)據(jù)類型 (NSInteger)和C數(shù)據(jù)類型(int, float, double, char,等)
使用copy: 對(duì)NSString
使用retain: 對(duì)其他NSObject和其子類
unsafe_unretained
unsafe_unretained 就是ios5版本以下的 assign ,也就是 unsafe_unretained , weak, assign 三個(gè)都是一個(gè)樣的。 因?yàn)?ios5用的是 weak ,那在ios4.3就用不了,如果你將 weak 修改為 unsafe_unretained ,那就可以用了。說(shuō)到底就是iOS 5之前的系統(tǒng)用該屬性代替 weak 來(lái)使用。
copy與retain:
1、copy其實(shí)是建立了一個(gè)相同的對(duì)象,而retain不是;
2、copy是內(nèi)容拷貝,retain是指針拷貝;
3、copy是內(nèi)容的拷貝 ,對(duì)于像NSString,的確是這樣,但是如果copy的是一個(gè)NSArray呢?這時(shí)只是copy了指向array中相對(duì)應(yīng)元素的指針.這便是所謂的"淺復(fù)制".
4、copy的情況:NSString *newPt = [pt copy];
此時(shí)會(huì)在堆上重新開辟一段內(nèi)存存放@"abc" 比如0X1122 內(nèi)容為@"abc 同時(shí)會(huì)在棧上為newPt分配空間 比如地址:0Xaacc 內(nèi)容為0X1122 因此retainCount增加1供newPt來(lái)管理0X1122這段內(nèi)存;
assign與retain:
1、assign: 簡(jiǎn)單賦值,不更改索引計(jì)數(shù);
2、assign的情況:NSString *newPt = [pt assing];
此時(shí)newPt和pt完全相同 地址都是0Xaaaa 內(nèi)容為0X1111 即newPt只是pt的別名,對(duì)任何一個(gè)操作就等于對(duì)另一個(gè)操作, 因此retainCount不需要增加;
3、assign就是直接賦值;
4、retain使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1,當(dāng)引用計(jì)數(shù)為0時(shí),dealloc函數(shù)被調(diào)用,內(nèi)存被回收;
5、retain的情況:NSString *newPt = [pt retain];
此時(shí)newPt的地址不再為0Xaaaa,可能為0Xaabb 但是內(nèi)容依然為0X1111。 因此newPt 和 pt 都可以管理"abc"所在的內(nèi)存,因此 retainCount需要增加1 ;
readonly:
1、屬性是只讀的,默認(rèn)的標(biāo)記是讀寫,如果你指定了只讀,在@implementation中只需要一個(gè)讀取器?;蛘呷绻闶褂聾synthesize關(guān)鍵字,也是有讀取器方法被解析
readwrite:
1、說(shuō)明屬性會(huì)被當(dāng)成讀寫的,這也是默認(rèn)屬性。設(shè)置器和讀取器都需要在@implementation中實(shí)現(xiàn)。如果使用@synthesize關(guān)鍵字,讀取器和設(shè)置器都會(huì)被解析;
nonatomic:
1、非原子性訪問(wèn),對(duì)屬性賦值的時(shí)候不加鎖,多線程并發(fā)訪問(wèn)會(huì)提高性能。如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法都為原子型事務(wù)訪問(wèn);
6.Cocoa 有哪些消息傳遞機(jī)制?
delegation,Notification,KVO,block,Target-Action。
http://www.cocoachina.com/industry/20131216/7543.html
7.簡(jiǎn)述ViewController 的?生命周期?
http://www.cnblogs.com/wayne23/p/3868535.html
http://www.csdn.net/article/2015-06-23/2825023
http://www.cnblogs.com/langtianya/p/4109469.html
http://www.cnblogs.com/langtianya/p/4110472.html
ViewController的生命周期
前面寫了iOS應(yīng)用程序的生命周期,這里會(huì)寫到ViewController的生命周期,這個(gè)更像Android的Activity的生命周期(見文章最后的圖)。ViewController生命周期會(huì)經(jīng)歷初始化、加載視圖、銷毀視圖、生命結(jié)束等過(guò)程。
1)init方法
初始化ViewController本身。
2)loadView方法
當(dāng)view需要被展示而它卻是nil時(shí),viewController會(huì)調(diào)用該方法。
如果代碼維護(hù)View的話需要重寫此方法,使用xib維護(hù)View的話不用重寫。
3)viewDidLoad方法
執(zhí)行完loadView后繼續(xù)執(zhí)行viewDidLoad,loadView時(shí)還沒有view,而viewDidLoad時(shí)view已經(jīng)創(chuàng)建好了。
4)viewDidUnload方法
當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法,內(nèi)存吃緊時(shí),在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無(wú)用內(nèi)存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式。
在該方法中將所有IBOutlet(無(wú)論是property還是實(shí)例變量)置為nil(系統(tǒng)release view時(shí)已經(jīng)將其release掉了)。
在該方法中釋放其他與view有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但非系統(tǒng)必須)的對(duì)象、在viewDidLoad中被創(chuàng)建的對(duì)象、緩存數(shù)據(jù)等。
一般認(rèn)為viewDidUnload是viewDidLoad的鏡像,因?yàn)楫?dāng)view被重新請(qǐng)求時(shí),viewDidLoad還會(huì)重新被執(zhí)行。
5)dealloc
釋放其他資源或內(nèi)存。

ViewController加載view過(guò)程,見下圖(loadView)
1)loadView

ViewController卸載View過(guò)程見(unLoadView)
2)unLoadView

Activity生命周期(Android)

iOS應(yīng)用程序生命周期(前后臺(tái)切換,應(yīng)用的各種狀態(tài))詳解
? http://www.cnblogs.com/langtianya/p/4110472.html
8.什么是RestFul API?
RESTful架構(gòu),就是目前最流行的一種互聯(lián)網(wǎng)軟件架構(gòu)。它結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴(kuò)展方便,所以正得到越來(lái)越多網(wǎng)站的采用。
http://www.itdecent.cn/p/00631797a60d
11.Objective-C 有私有變量,私有方法嗎?
先說(shuō)私有方法,
由于Objective-C的動(dòng)態(tài)消息傳遞機(jī)制,OC中不存在真正意義上的私有方法。
但是如果你不在.h文件中聲明,只在.m文件中實(shí)現(xiàn),或在.m文件的Class Extension里聲明,那么基本上和私有方法差不多。
至于私有變量是可以通過(guò)@private來(lái)聲明的,例如
@interface Sample : NSObject{
@private
NSString *tteesstt;
}
@property (nonatomic,strong) NSString *hoge;
- (void)foo;
@end
則tteesstt變量是私有的。而屬性hoge是默認(rèn)公有。
現(xiàn)在Apple官方文檔里是用property比較多,直接定義instance variable少。將property定義到.m的Class Extension也基本上和私有變量差不多。
簡(jiǎn)而言之,將你希望公有的放到.h文件,私有的放到.m文件。在import時(shí)只import .h文件(.m文件也是可以import的,但是我們一般不這么做)。
12.protocol 能添加屬性嗎?
可以實(shí)現(xiàn)共享屬性
1.談?wù)凷wift 和Objective-C 的優(yōu)缺點(diǎn)
2.n 的階乘末尾有幾個(gè)0?
其實(shí),從"那些數(shù)相乘可以得到10"這個(gè)角度,問(wèn)題就變得比較的簡(jiǎn)單了。
首先考慮,如果N的階乘為K和10的M次方的乘積,那么N!末尾就有M的0。如果將N的階乘分解后,那么
N的階乘可以分解為: 2的X次方,3的Y次方,4的5次Z方,.....的成績(jī)。由于10 = 2 * 5,所以M只能和X和Z有關(guān),每一對(duì)2和5相乘就可以得到一個(gè)10,于是M = MIN(X,Z),不難看出X大于Z,因?yàn)楸?整除的頻率比被5整除的頻率高的多。所以可以把公式簡(jiǎn)化為M=Z.
由上面的分析可以看出,只要計(jì)算處Z的值,就可以得到N!末尾0的個(gè)數(shù)
要計(jì)算Z,最直接的方法就是求出N的階乘的所有因式(1,2,3,...,N)分解中5的指數(shù)。然后求和
intfun1(intn)
{
intnum=0;
inti,j;
for(i=5;i<=n;i+= 5)
{
j=i;
while(j%5==0)
{
num++;
j/=5;
}
}
returnnum;
}
3. iOS 環(huán)境下?一共有?幾種多線程編程技術(shù)?
NSThread、Cocoa NSOperation、GCD(全稱:Grand Central Dispatch)
4.現(xiàn)在有?一張?大圖,想讓?用戶下載到?一半能取消下載,你應(yīng)該?用哪種多線程?方法來(lái)實(shí)現(xiàn)?
5.weak 和__unsafe_unretained 的區(qū)別, __unsafe_unretained 的使?用場(chǎng)景
6.Block?里引?用到self 的話?一定要?用weak self 嗎?
7.簡(jiǎn)述Runloop 的原理
8.NSTimer 只能在主線程上運(yùn)?行嗎?
9.UIView 在什么時(shí)候會(huì)調(diào)?用drawRect: ,當(dāng)我調(diào)?用setNeedsDisplay 后,視圖會(huì)
?立刻刷新嗎?不會(huì)的話是在什么時(shí)候刷新?
10.loadView 和viewDidLoad 的區(qū)別
11.簡(jiǎn)述Autolayout 布局系統(tǒng)的原理
13.?用 CocoaPods 的時(shí)候,如果?一個(gè)庫(kù)依賴AFNetwork 1.1 ,另?一個(gè)庫(kù)依賴AFNetwork 2.0 ,能夠安裝嗎?沖突是如何解決的?
17.多線程編程的那幾種技術(shù)和它們之間的關(guān)系
18.如果有寫會(huì)Autolayout, 就問(wèn)Autolayout的原理(很多人只會(huì)加約束,卻不知道Autolayout和Frame之間的關(guān)系)
1.如何?用GCD 來(lái)實(shí)現(xiàn)NSOperation 的取消?
1.寫一個(gè)NSString類的實(shí)現(xiàn)
+ (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 關(guān)鍵字的作用:
(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,
因此其值在下次調(diào)用時(shí)仍維持上次的值;
(2)在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn);
(3)在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明
它的模塊內(nèi);
(4)在類中的 static 成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝;
(5)在類中的 static 成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收 this 指針,因而只能訪問(wèn)類的static 成員變量。
3線程與進(jìn)程的區(qū)別和聯(lián)系?
進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。
程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
4堆和棧的區(qū)別
管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。
申請(qǐng)大小:
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。
5什么是鍵-值,鍵路徑是什么
模型的性質(zhì)是通過(guò)一個(gè)簡(jiǎn)單的鍵(通常是個(gè)字符串)來(lái)指定的。視圖和控制器通過(guò)鍵來(lái)查找相應(yīng)的屬性值。在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問(wèn)對(duì)象屬性的機(jī)制。
鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列。第一個(gè)鍵的
性質(zhì)是由先前的性質(zhì)決定的,接下來(lái)每個(gè)鍵的值也是相對(duì)于其前面的性質(zhì)。鍵路徑使您可以以獨(dú)立于模型
實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性質(zhì)。通過(guò)鍵路徑,您可以指定對(duì)象圖中的一個(gè)任意深度的路徑,使其指向相
關(guān)對(duì)象的特定屬性。
6目標(biāo)-動(dòng)作機(jī)制
目標(biāo)是動(dòng)作消息的接收者。一個(gè)控件,或者更為常見的是它的單元,以插座變量(參見"插座變量"部分)
的形式保有其動(dòng)作消息的目標(biāo)。
動(dòng)作是控件發(fā)送給目標(biāo)的消息,或者從目標(biāo)的角度看,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法。
程序需要某些機(jī)制來(lái)進(jìn)行事件和指令的翻譯。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制。
7objc的內(nèi)存管理
?? 如果您通過(guò)分配和初始化(比如[[MyClass alloc] init])的方式來(lái)創(chuàng)建對(duì)象,您就擁
有這個(gè)對(duì)象,需要負(fù)責(zé)該對(duì)象的釋放。這個(gè)規(guī)則在使用NSObject的便利方法new 時(shí)也同樣適用。
?? 如果您拷貝一個(gè)對(duì)象,您也擁有拷貝得到的對(duì)象,需要負(fù)責(zé)該對(duì)象的釋放。
?? 如果您保持一個(gè)對(duì)象,您就部分擁有這個(gè)對(duì)象,需要在不再使用時(shí)釋放該對(duì)象。
反過(guò)來(lái),
?? 如果您從其它對(duì)象那里接收到一個(gè)對(duì)象,則您不擁有該對(duì)象,也不應(yīng)該釋放它(這個(gè)規(guī)則有少數(shù)
的例外,在參考文檔中有顯式的說(shuō)明)。
8 自動(dòng)釋放池是什么,如何工作
當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池。它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。
1. ojc-c 是通過(guò)一種"referring counting"(引用計(jì)數(shù))的方式來(lái)管理內(nèi)存的, 對(duì)象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷毀.
2. NSAutoreleasePool 就是用來(lái)做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.
3. autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.
9類工廠方法是什么
類工廠方法的實(shí)現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個(gè)步驟中,返回被創(chuàng)建的對(duì)象,并
進(jìn)行自動(dòng)釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。
工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過(guò)程提供對(duì)
象的分配信息。
類工廠方法的另一個(gè)目的是使類(比如NSWorkspace)提供單件實(shí)例。雖然init...方法可以確認(rèn)一
個(gè)類在每次程序運(yùn)行過(guò)程只存在一個(gè)實(shí)例,但它需要首先分配一個(gè)“生的”實(shí)例,然后還必須釋放該實(shí)例。
工廠方法則可以避免為可能沒有用的對(duì)象盲目分配內(nèi)存。
10單件實(shí)例是什么
Foundation 和 Application Kit 框架中的一些類只允許創(chuàng)建單件對(duì)象,即這些類在當(dāng)前進(jìn)程中的唯一實(shí)例。舉例來(lái)說(shuō),NSFileManager 和NSWorkspace 類在使用時(shí)都是基于進(jìn)程進(jìn)行單件對(duì)象的實(shí)例化。當(dāng)向這些類請(qǐng)求實(shí)例的時(shí)候,它們會(huì)向您傳遞單一實(shí)例的一個(gè)引用,如果該實(shí)例還不存在,則首先進(jìn)行實(shí)例的分配和初始化。單件對(duì)象充當(dāng)控制中心的角色,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)。如果類在概念上只有一個(gè)實(shí)例(比如
NSWorkspace),就應(yīng)該產(chǎn)生一個(gè)單件實(shí)例,而不是多個(gè)實(shí)例;如果將來(lái)某一天可能有多個(gè)實(shí)例,您可
以使用單件實(shí)例機(jī)制,而不是工廠方法或函數(shù)。
1. Object-C有多繼承嗎?沒有的話用什么代替?
cocoa 中所有的類都是NSObject 的子類
多繼承在這里是用protocol 委托代理 來(lái)實(shí)現(xiàn)的 你不用去考慮繁瑣的多繼承 ,虛基類的概念. ood的多態(tài)特性 在 obj-c 中通過(guò)委托來(lái)實(shí)現(xiàn).
2. Object-C有私有方法嗎?私有變量呢?
objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對(duì)象只暴露有用的東西. 如果沒有了私有方法的話, 對(duì)于一些小范圍的代碼重用就不那么順手了.
在類里面聲名一個(gè)私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod; – (void)thisIsAnInstanceMethod;
@end
@interface Controller (private)
- (void)thisIsAPrivateMethod;
- @end
@private可以用來(lái)修飾私有變量
在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的
3. #import和#include的區(qū)別,@class代表什么?
@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,在m文件中還是需要使用#import‘
而#import比起#include的好處就是不會(huì)引起重復(fù)包含
4. 線程和進(jìn)程的區(qū)別?
進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
5. 堆和棧的區(qū)別?
管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。 申請(qǐng)大?。?/p>
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。 分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。
6. Object-C的內(nèi)存管理?
1.當(dāng)你使用new,alloc和copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1.當(dāng)你不再使用該對(duì)象時(shí),你要負(fù)責(zé)向該對(duì)象發(fā)送一條release或autorelease消息.這樣,該對(duì)象將在使用壽命結(jié)束時(shí)被銷毀.
2.當(dāng)你通過(guò)任何其他方法獲得一個(gè)對(duì)象時(shí),則假設(shè)該對(duì)象的保留計(jì)數(shù)器值為1,而且已經(jīng)被設(shè)置為自動(dòng)釋放,你不需要執(zhí)行任何操作來(lái)確保該對(duì)象被清理.如果你打算在一段時(shí)間內(nèi)擁有該對(duì)象,則需要保留它并確保在操作完成時(shí)釋放它.
3.如果你保留了某個(gè)對(duì)象,你需要(最終)釋放或自動(dòng)釋放該對(duì)象.必須保持retain方法和release方法的使用次數(shù)相等.
__weak __typeof(&*self)weakSelf =self; 等同于
__weak UIViewController *weakSelf =self;
為什么不用__block 是因?yàn)橥ㄟ^(guò)引用來(lái)訪問(wèn)self的實(shí)例變量 ,self被retain,block也是一個(gè)強(qiáng)引用,引起循環(huán)引用,用__week是弱引用,當(dāng)self釋放時(shí),weakSelf已經(jīng)等于nil。