




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、iOS面試Object-C有多繼承嗎?沒有的話用什么代替?cocoa 中所有的類都是NSObject 的子類多繼承在這里是用protocol 委托代理 來實現的你不用去考慮繁瑣的多繼承 ,虛基類的概念.ood的多態特性 在 obj-c 中通過委托來實現.Object-C有私有方法嗎?私有變量呢?objective-c 類里面的方法只有兩種, 靜態方法和實例方法. 這似乎就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私有方法的話, 對
2、于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個私有方法interface Controller : NSObject NSString *something; + (void)thisIsAStaticMethod; (void)thisIsAnInstanceMethod;endinterface Controller (private) -(void)thisIsAPrivateMethod;endprivate可以用來修飾私有變量在ObjectiveC中,所有實例變量默認都是私有的,所有實例方法默認都是公有的關鍵字const什么含義const意味著”只讀”,下面的聲明
3、都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。結論:; 關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告
4、訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。); 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。; 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。欲阻止一個變量被改變,可以使用 const 關鍵字。在定義該 const 變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;(2)對指針來說,可
5、以指定指針本身為 const,也可以指定指針所指的數據為 const,或二者同時指定為 const;(3)在一個函數聲明中,const 可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;(4)對于類的成員函數,若指定其為 const 類型,則表明其是一個常函數,不能修改類的成員變量;(5)對于類的成員函數,有時候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。關鍵字volatile有什么含義?并給出三個不同例子?一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯
6、器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子: 并行設備的硬件寄存器(如:狀態寄存器) 一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables) 多線程應用中被幾個任務共享的變量 一個參數既可以是const還可以是volatile嗎?解釋為什么。 一個指針可以是volatile 嗎?解釋為什么。下面是答案: 是的。一個例子是只讀的狀態寄存器。它是volatile因為
7、它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。 是的。盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。static作用?函數體內 static 變量的作用范圍為該函數體,不同于 auto 變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;(2)在模塊內的 static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模
8、塊內;(4)在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;(5)在類中的 static 成員函數屬于整個類所擁有,這個函數不接收 this 指針,因而只能訪問類的static 成員變量。#import和#include的區別,class代表什么?class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import而#import比起#include的好處就是不會引起重復包含線程和進程的區別?進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實
9、現系統對應用的并發性。進 程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個 進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序 健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。堆和棧的區別?管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產生memory leak。申請大小:棧:
10、在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。碎片問題:對于堆來講,頻繁的new/delete勢必會造成內存空間的
11、不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內存塊從棧中間彈出分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C+函數庫提供的,它的機制是很復
12、雜的。Object-C的內存管理?1.當你使用new,alloc和copy方法創建一個對象時,該對象的保留計數器值為1.當你不再使用該對象時,你要負責向該對象發送一條release或autorelease消息.這樣,該對象將在使用壽命結束時被銷毀.2.當你通過任何其他方法獲得一個對象時,則假設該對象的保留計數器值為1,而且已經被設置為自動釋放,你不需要執行任何操作來確保該對象被清理.如果你打算在一段時間內擁有該對象,則需要保留它并確保在操作完成時釋放它.3.如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數相等.為什么很多內置的類,
13、如TableViewController的delegate的屬性是assign不是retain?循環引用所有的引用計數系統,都存在循環應用的問題。例如下面的引用關系: 對象a創建并引用到了對象b. 對象b創建并引用到了對象c. 對象c創建并引用到了對象b.這時候b和c的引用計數分別是2和1。當a不再使用b,調用rel
14、ease釋放對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, 如果這個delegat
15、e是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用來決定編譯器生成的
16、getter和setter是否為原子操作。在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函數會變成下面這樣:if (property != newValue) property release;property = newValue retain;對象是什么時候被release的?引用計數為0時。autorelease實際上只是把對release的調用延遲了,對于每一個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被調用Release。對于每一個R
17、unloop, 系統會隱式創建一個Autoreleasepool,這樣所有的releasepool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autorelease pool會被銷毀,這樣這個pool里的每個Object(就是autorelease的對象)會被release。那什么是一個Runloop呢? 一個UI事件,Timer call, delegate call, 都會是一個新的RunloopiOS有沒有垃圾回收?Objective-C 2.0也是有垃圾回收機制的,但是只能在Mac OS X Leop
18、ard 10.5 以上的版本使用。tableView的重用機制?查看UITableView頭文件,會找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells兩個結構。visiableCells內保存當前顯示的cells,reusableTableCells保存可重用的cells。TableView顯示之初,reusableTableCells為空,那么tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。開始的cell
19、都是通過UITableViewCell allocinitWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier來創建,而且cellForRowAtIndexPath只是調用最大顯示cell數的次數。比如:有100條數據,iPhone一屏最多顯示10個cell。程序最開始顯示TableView的情況是:1. 用UITableViewCell allocinitWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier創建10次
20、cell,并給cell指定同樣的重用標識(當然,可以為不同顯示類型的cell指定不同的標識)。并且10個cell全部都加入到visiableCells數組,reusableTableCells為空。2. 向下拖動tableView,當cell1完全移出屏幕,并且cell11(它也是alloc出來的,原因同上)完全顯示出來的時候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。3. 接著向下拖動tableView,因為reusableTableCells中已經有值,所以,當需要顯示新
21、的cell,cellForRowAtIndexPath再次被調用的時候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要顯示的Cell就可以正常重用了。ViewController 的loadView、viewDidLoad、viewDidUnload分別是什么時候調用的,在自定義ViewCointr
22、oller時在這幾個函數中應該做什么工作?由init、loadView、viewDidLoad、viewDidUnload、dealloc的關系說起init方法在init方法中實例化必要的對象(遵從LazyLoad思想)init方法中初始化ViewController本身loadView方法當view需要被展示而它卻是nil時,viewController會調用該方法。不要直接調用該方法。如果手工維護views,必須重載重寫該方法如果使用IB維護views,必須不能重載重寫該方法loadView和IB構建view你在控制器中實現了loadView方法,那么你可能會在應用運行的某個時候被內存管理
23、控制調用。 如果設備內存不足的時候, view 控制器會收到didReceiveMemoryWarning的消息。 默認的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy里面,且你的控制器實現了loadView方法,那么這個view將被release, loadView方法將被再次調用來創建一個新的view。viewDidLoad方法viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用。重載重寫該方法以進一步定制view在iPhone OS3.0及之后的
24、版本中,還應該重載重寫viewDidUnload來釋放對view的任何索引viewDidLoad后調用數據ModelviewDidUnload方法當系統內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)內存吃緊時,在iPhone OS3.0之前didReceiveMemoryWarning是釋放無用內存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統release view時已經將其release掉了)在該方法中釋放其他與view有關的對象、其他在運
25、行時創建(但非系統必須)的對象、在viewDidLoad中被創建的對象、緩存數據等release對象后,將對象置為nil(IBOutlet只需要將其置為nil,系統release view時已經將其release掉了)一般認為viewDidUnload是viewDidLoad的鏡像,因為當view被重新請求時,viewDidLoad還會重新被執行viewDidUnload中被release的對象必須是很容易被重新創建的對象(比如在viewDidLoad或其他方法中創建的對象),不要release用戶數據或其他很難被重新創建的對象dealloc方法viewDidUnload和dealloc方法沒
26、有關聯,dealloc還是繼續做它該做的事情ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是什么?當程序接到內存警告時View Controller將會收到這個消息:didReceiveMemoryWarning從iOS3.0開始,不需要重載這個函數,把釋放內存的代碼放到viewDidUnload中去。這個函數的默認實現是:檢查controller是否可以安全地釋放它的view(這里加粗的view指的是controller的view屬性),比如view本身沒有superview并且可以被很容易地重建(從nib或者loadView函數)
27、。如果view可以被釋放,那么這個函數釋放view并調用viewDidUnload。你可以重載這個函數來釋放controller中使用的其他內存。但要記得調用這個函數的super實現來允許父類(一般是UIVIewController)釋放view。如果你的ViewController保存著view的子view的引用,那么,在早期的iOS版本中,你應該在這個函數中來釋放這些引用。而在iOS3.0或更高版本中,你應該在viewDidUnload中釋放這些引用。 列舉Cocoa中常見的集中多線程的實現,并談談多線程安全的幾種解決辦法,一般什么地方會用到多線程?NSOperationNSTh
28、readsychonized怎么理解MVC,在Cocoa中MVC是怎么實現的?MVC設 計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。視圖對象 知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。控制器對象是應用程序的視圖對象和模型對象之間的協調者。ViewCotrollerXibdelegate和notification區別,分別在什么情況下使用?KVC(Key-Value-Coding)KVO(Key-Value-Observing)理解KVC與KVO(鍵-值-編碼與鍵-值-監看)當通過KV
29、C調用對象時,比如:self valueForKey:”someKey”時,程序會自動試圖通過幾種不同的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。(Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,
30、前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最后的機會響應這個請求。self.跟self什么區別?id、nil代表什么?id id和void *并非完全一樣。在上面的代碼中,id是指向struct objc_object的一個指針,這個意思基本上是說,id是一個指向任何一個繼承了Object(或者NSO
31、bject)類的對象。需要注意的是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)的
32、對象,你需要釋放(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,以防止它在被使用之前就被自
33、動釋放掉。但是在retain后,一定要在適當的時候進行釋放。 關于索引計數(Reference Counting)的問題retain值 = 索引計數(ReferenceCounting)NSArray對象會retain(retain值加一)任何數組中的對象。當NSArray被卸載(dealloc)的時候,所有數組中的對象會被執行一次釋放(retain值減一)。不僅僅是NSArray,任何收集類(CollectionClasses)都執行類似操作。例如NSDictionary,甚至UINavigationController。Alloc/init建立的對象,索引計數
34、為1。無需將其再次retain。NSArray array和NSDate date等“方法”建立一個索引計數為1的對象,但是也是一個自動釋放對象。所以是本地臨時對象,那么無所謂了。如果是打算在全Class中使用的變量(iVar),則必須retain它。缺省的類方法返回值都被執行了“自動釋放”方法。(*如上中的NSArray)在類中的卸載方法“dealloc”中,release所有未被平衡的NS對象。(*所有未被autorelease,而retain值為1的)類別的作用?有時我們需要在一個已經定義好的類中增加一些方法,而不想去重寫該類。比如,當工程已經很大,代碼量比較多,或者類中已經包住很多方法
35、,已經有其他代碼調用了該類創建對象并使用該類的方法時,可以使用類別對該類擴充新的方法。 注意:類別只能擴充方法,而不能擴充成員變量。委托(舉例)委托代理(degegate),顧名思義,把某個對象要做的事情委托給別的對象去做。那么別的對象就是這個對象的代理,代替它來打理要做的事。反映到程序中,首先要明確一個對象的委托方是哪個對象,委托所做的內容是什么。委托機制是一種設計模式,在很多語言中都用到的,這只是個通用的思想,網上會有很多關于這方面的介紹。那么在蘋果開發過程中,用到委托的程序實現思想如下,我主要拿如何在視圖之間傳輸信息做個例子。譬如:在兩個頁面(UIIview視圖對象
36、)實現傳值,用委托(delegate)可以很好做到!方法:類Ainterface A:UIView id transparendValueDelegate; property(nomatic, retain) idtransparendValueDelegate;endimplemtion Asynthesize transparendValueDelegate-(void)Function
37、160; NSString* value = "hello" /讓代理對象執行transparendValue動作 transparendValueDelegate transparendValue:value;end類Binterface B:UIView NSString* value;endimplemtion B-(void)
38、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之間可以通
39、過委托來傳值!下面這個例子委托有兩類:1、一個視圖類對象的代理對象為父視圖,子視圖用代理實現讓父視圖顯示別的子視圖2、同一父視圖下的一個子視圖為另一個子視圖的代理對象,讓另一個子視圖改變自身背景色為給定的顏色規范格式如下:protocol TransparendValueDelegate;interface A:UIViewid< TransparendValueDelegate > m_dTransparendValueDelegate;property(nomatic, retain) id m_dTransparendValueDelegate;end/代理協議的聲
40、明protocol TransparendValueDelegat -(void)transparendValue:(NSString*)fromValue;retainCount? 1.objective-c中的數字對象都有哪些,簡述它們與基本數據類型的區別是什么2.用NSLog函數輸出一個浮點類型,結果四舍五入,并保留一位小數3.截取字符串”20“ 中 字符前面及后面的數據,分別輸出它們4.objective-c中的詞典對象、可變詞典對象是哪個,初始化一個含有兩個鍵值對的可變詞典對象,并動態的添加和刪除一條記錄
41、,輸出第一條記錄5.獲取項目根路徑,并在其下創建一個名稱為userData的目錄。6.在一個對象的方法里面: = “object”;和name ”object”有什么不同嗎?7.定義屬性時,什么情況使用copy,assign,和retain第3題:NSRange range = responseString rangeOfString:"|"int location = range.location;NSString *str1 = responseString substringToIndex:location;NSString *str2 = resp
42、onseString substringFromIndex:location+1;第4題:NSDictionary NSMutableDictionaryNSMutableDictionary *dic = NSMutableDictionary dictionaryWithObjectsAndKeys:"value1","key1","value2","key2",nil;dic setObject:"value3" forKey:"key3"dic removeObjec
43、tForKey:"key3"dic objectForKey:"key1"第5題:/ 獲取根路徑NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);NSString *documentsDirectory = paths objectAtIndex:;/ 創建文件系統管理器NSFileManager *fileManager = NSFileManager alloc init;/ 判斷userData目錄是否存在if
44、(!fileManager fileExistsAtPath:NSString stringWithFormat:"%/userData", documentsDirectory) / 不存在,創建一個userData目錄fileManager createDirectoryAtPath:NSString stringWithFormat:"%/userData", documentsDirectorywithIntermediateDirectories:false attributes:nil error:nil;第6題: = “o
45、bject”會調用對象的setName()方法,name = “object”會直接把object賦值給當前對象的name 屬性。并且 這樣retainCount會加,而name就不會。第 7題:assign用于簡單數據類型,如NSInteger,double,bool,retain 和copy用戶對象,copy用于當 a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調用b會crash,如果用copy 的方式,a和b各自有自己的內存,就可以解決這個問題。retain 會使計數器加一,也可以解決assign的問題。另外:tomic和nonatom
46、ic用來決定編譯器生成的getter和setter是否為原子操作。 在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。1. 1.寫一個NSString類的實現+ (id)initWithCString:(c*t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id) stringWithCString: (c*t char*)nullTerminatedCString &
47、#160; encoding: (NSStringEncoding)encoding NSString *obj; obj = self allocWithZone: NSDefaultMallocZone(); obj = obj initWithCString: nullTerminatedCString encoding: encoding; return AUTORELEASE(obj); 2static
48、60;關鍵字的作用: (1)函數體內 static 變量的作用范圍為該函數體,不同于 auto 變量,該變量的內存只被分配一次, 因此其值在下次調用時仍維持上次的值; (2)在模塊內的 static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問; (3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明 它的模塊內; (4)在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝; (5)在類中的 static 成員函數屬于整個類所擁有,這個函數不
49、接收 this 指針,因而只能訪問類的static 成員變量。 3線程與進程的區別和聯系? 進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。 程 和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進 程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健 壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且
50、又要共享某些變量的并發操作,只能用線程,不能用進程。4堆和棧的區別 管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產生memory leak。 申請大小: 棧: 在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因 此,能從棧獲得的空間較小。 堆:堆是向高地址擴展的數據結構,是不連續
51、的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。 碎片問題:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內存塊從棧中間彈出 分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函
52、數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。 分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C+函數庫提供的,它的機制是很復雜的。5什么是鍵-值,鍵路徑是什么 模型的性質是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵來查找相應的屬性值。在一個給定的實體中,同一個屬性的所有值具有相同的數據類型。鍵-值編碼技術用于進行這樣的查找它是一種間接訪問對象屬性的機制。 鍵路徑是一個由用點作分隔符的鍵
53、組成的字符串,用于指定一個連接在一起的對象性質序列。第一個鍵的 性質是由先前的性質決定的,接下來每個鍵的值也是相對于其前面的性質。鍵路徑使您可以以獨立于模型 實現的方式指定相關對象的性質。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相 關對象的特定屬性。 6目標-動作機制 目標是動作消息的接收者。一個控件,或者更為常見的是它的單元,以插座變量(參見"插座變量"部分) 的形式保有其動作消息的目標。 動作是控件發送給目標的消息,或者從目標的角度看,它是目標為了響應動作而實現的方法。
54、 程序需要某些機制來進行事件和指令的翻譯。這個機制就是目標-動作機制。 7objc的內存管理 ? 如果您通過分配和初始化(比如MyClass alloc init)的方式來創建對象,您就擁 有這個對象,需要負責該對象的釋放。這個規則在使用NSObject的便利方法new 時也同樣適用。 ? 如果您拷貝一個對象,您也擁有拷貝得到的對象,需要負責該對象的釋放。 ? 如果您保持一個對象,您就部分擁有這個對象,需要在不再使用時釋放該對象。 反過來, ? 如果您從其它
55、對象那里接收到一個對象,則您不擁有該對象,也不應該釋放它(這個規則有少數 的例外,在參考文檔中有顯式的說明)。 8 自動釋放池是什么,如何工作 當 您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定 義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。 1. ojc-c 是 通過一種"referring counting"(引用計數)的方式來管理內存的,
56、 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀. 2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一. 9類工廠方法是什么 類工廠方法的實現是為了向客戶提供方便,它們將分配和
57、初始化合在一個步驟中,返回被創建的對象,并 進行自動釋放處理。這些方法的形式是+ (type)className.(其中 className不包括任何前綴)。 工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對 象的分配信息。 類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init.方法可以確認一 個類在每次程序運行過程只存在一個實例,但它需要首先分配一個“生的”實例,然后還必須釋放該實例。 工廠方法則可以避免為可能沒有用的對象盲目分配內存。 10單件實
58、例是什么 Foundation 和 Application Kit 框架中的一些類只允許創建單件對象,即這些類在當前進程中的唯一實例。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基于進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,如果該實例還不存在,則首先進行實例的分配 和初始化。單件對象充當控制中心的角色,負責指引或協調類的各種服務。如果類在概念上只有一個實例(比如 NSWorkspace),就應該產生一個單件實例,而不是多個實例;如果將來某一天可能有多個實例,您可 以使用單件實例
59、機制,而不是工廠方法或函數。11動態綁定 在運行時確定要調用的方法 動 態綁定將調用方法的確定也推遲到運行時。在編譯時,方法的調用并不和代碼綁定在一起,只有在消實發送出來之后,才確定被調用的代碼。通過動態類型和動態綁 定技術,您的代碼每次執行都可以得到不同的結果。運行時因子負責確定消息的接收者和被調用的方法。運行時的消息分發機制為動態綁定提供支持。當您向一個動 態類型確定了的對象發送消息時,運行環境系統會通過接收者的isa指針定位對象的類,并以此為起點確定被調用的方法,方法和消息是動態綁定的。而且,您不 必在Objective-C 代碼中做任何工作,就可以自動獲
60、取動態綁定的好處。您在每次發送消息時, 特別是當消息的接收者是動態類型已經確定的對象時,動態綁定就會例行而透明地發生。12obj-c的優缺點 objc優點: 1) Cateogies 2) Posing 3) 動態識別 4) 指標計算 5)彈性訊息傳遞 6) 不是一個過度復雜的 C 衍生語言 7) Objective-C 與 C
61、+ 可混合編程 缺點: 1) 不支援命名空間 2) 不支持運算符重載 3) 不支持多重繼承 4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。 13sprintf,strcpy,memcpy使用上有什么要注意的地方 strcpy是一個字符串拷貝的函數,它的函數原型為strcpy(char *dst, c*t char *src); 將 src開始的一段字符串拷
62、貝到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 a10; /
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠化維修及養護協議
- 2025年四川省綿陽市江油市八校中考物理一模試卷(含解析)
- 低碳材料采購合同示范
- 香港借款合同范本
- 菜籽油購銷合同范本
- 個人短期借款合同協議
- 江蘇省永豐初級中學2025年高三生物試題期末練習試卷含解析
- 云南省臨滄市鳳慶縣重點名校2024-2025學年初三下學期4月考生物試題試卷含解析
- 山東理工職業學院《畫法幾何與CAD制圖》2023-2024學年第二學期期末試卷
- 泰州職業技術學院《臨床室管理》2023-2024學年第二學期期末試卷
- 建筑工程安全知識課件
- 鋼材三方采購合同范本
- 貿易安全培訓管理制度
- 全民營養周知識講座課件
- 螺栓緊固標準規范
- 社區時政考試試題及答案
- MOOC 創業基礎-暨南大學 中國大學慕課答案
- 畢業設計10層框架—剪力墻結構體系設計計算書
- 東南大學論文模板v1.1
- 賽英公司FOD監測雷達系統
- 固體制劑車間主要過程控制點
評論
0/150
提交評論