1.Difference between shallow copy and deep copy?淺復(fù)制和深復(fù)制的區(qū)別?
答案:淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?,而不?fù)制引用對象本身。深層復(fù)制:復(fù)制引用對象本身。意思就是說我有個A對象,復(fù)制一份后得到A_copy對象后,對于淺復(fù)制來說,A和A_copy指向的是同一個內(nèi)存資源,復(fù)制的只不過是是一個指針,對象本身資源還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實違背了我們復(fù)制拷貝的一個思想。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨立對象本身。用網(wǎng)上一哥們通俗的話將就是:淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。
2.What is advantage of categories? What is difference
between implementing a category and inheritance?類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?
答案:category可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級。類別主要有3個作用:(1)將類的實現(xiàn)分散到多個不同文件或多個不同框架中。(2)創(chuàng)建對私有方法的前向引用。(3)向?qū)ο筇砑臃钦絽f(xié)議。繼承可以增加,修改或者刪除方法,并且可以增加屬性。
3.Difference between categories and extensions?類別和類擴展的區(qū)別。
答案:category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實現(xiàn)的。extensions可以認為是一個私有的Category。
4.Difference between protocol in objective c and
interfaces in java?obc中的協(xié)議和java中的接口概念有何不同?
答案:OBC中的代理有2層含義,官方定義為formal和informal protocol。前者和Java接口一樣。informal protocol中的方法屬于設(shè)計模式考慮范疇,不是必須實現(xiàn)的,但是如果有實現(xiàn),就會改變類的屬性。其實關(guān)于正式協(xié)議,類別和非正式協(xié)議我很早前學(xué)習(xí)的時候大致看過,也寫在了學(xué)習(xí)教程里“非正式協(xié)議概念其實就是類別的另一種表達方式“這里有一些你可能希望實現(xiàn)的方法,你可以使用他們更好的完成工作”。這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現(xiàn)。然后你在后期可以直接使用這些更好的方法。這么看,總覺得類別這玩意兒有點像協(xié)議的可選協(xié)議。"現(xiàn)在來看,其實protocal已經(jīng)開始對兩者都統(tǒng)一和規(guī)范起來操作,因為資料中說“非正式協(xié)議使用interface修飾“,現(xiàn)在我們看到協(xié)議中兩個修飾詞:“必須實現(xiàn)(@requied)”和“可選實現(xiàn)(@optional)”。
5.What are KVO and KVC?
答案:kvc:鍵-值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機制。很多情況下可以簡化程序代碼。apple文檔其實給了一個很好的例子。kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。具體用看到嗯哼用到過的一個地方是對于按鈕點擊變化狀態(tài)的的監(jiān)控。比如我自定義的一個button[cpp]?[selfaddObserver:self forKeyPath:@"highlighted" options:0context:nil];???#pragma mark KVO??-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)objectchange:(NSDictionary *)change context:(void*)context?{???? if ([keyPath isEqualToString:@"highlighted"]) {???????? [selfsetNeedsDisplay];???? }?}
對于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變,理論上來說是和kvc機制的道理是一樣的。對于kvc機制如何通過key尋找到value:“當通過KVC調(diào)用對象時,比如:[self valueForKey:@”someKey”]時,程序會自動試圖通過幾種不同的方式解析這個調(diào)用。首先查找對象是否帶有someKey這個方法,如果沒找到,會繼續(xù)查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續(xù)試圖調(diào)用-(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現(xiàn)的話,程序會拋出一個NSUndefinedKeyException異常錯誤。(cocoachina.com注:Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)設(shè)計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發(fā)生前,有最后的機會響應(yīng)這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處?!皝碇羉ocoa,這個說法應(yīng)該挺有道理。因為我們知道button卻是存在一個highlighted實例變量.因此為何上面我們只是add一個相關(guān)的keypath就行了,可以按照kvc查找的邏輯理解,就說的過去了。
6.What is purpose of delegates?代理的作用?
答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針??梢詼p少框架復(fù)雜度。另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機制的一種類似。
7.What are mutable and immutable types in Objective C?obc中可修改和不可以修改類型。
答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣。比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。
8.When we call objective c is runtime language what does
it mean?我們說的obc是動態(tài)運行時語言是什么意思?
答案:多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態(tài)。簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器)。因此也可以說,運行時機制是多態(tài)的基礎(chǔ)?~~~
9.what is difference between NSNotification and protocol?通知和協(xié)議的不同之處?
答案:協(xié)議有控制鏈(has-a)的關(guān)系,通知沒有。首先我一開始也不太明白,什么叫控制鏈(專業(yè)術(shù)語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發(fā)送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經(jīng)濟代理人,很多時候一個經(jīng)濟人負責(zé)好幾個明星的事務(wù)。只是對于不同明星間,代理的事物對象都是不一樣的,一一對應(yīng),不可能說明天要處理A明星要一個發(fā)布會,代理人發(fā)出處理發(fā)布會的消息后,別稱B的發(fā)布會了。但是通知就不一樣,他只關(guān)心發(fā)出通知,而不關(guān)心多少接收到感興趣要處理。因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應(yīng)關(guān)系。
11.Polymorphism?關(guān)于多態(tài)性
答案:多態(tài),子類指針可以賦值給父類。這個題目其實可以出到一切面向?qū)ο笳Z言中,因此關(guān)于多態(tài),繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。最重要的是轉(zhuǎn)化成自我理解。
12.Singleton?對于單例的理解
答案:11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎(chǔ)?;灸苡檬煜さ恼Z言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。進一步點,考慮下如何在多線程訪問單例時的安全性。
13.What is responder chain?說說響應(yīng)鏈
答案: 事件響應(yīng)鏈。包括點擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播??梢哉f點事件的分發(fā),傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了嚴重懷疑題目出到越后面就越籠統(tǒng)。
14.Difference between frame and bounds?frame和bounds有什么不同?
答案:frame指的是:該view在父view坐標系統(tǒng)中的位置和大小。(參照點是父親的坐標系統(tǒng))bounds指的是:該view在本身坐標系統(tǒng)中 的位置和大小。(參照點是本身坐標系統(tǒng))
15.Difference between method and selector?方法和選擇器有何不同?
答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現(xiàn).詳情可以看apple文檔。
16.Is there any garbage collection mechanism in Objective
C.?OBC的垃圾回收機制?
答案:OBC2.0有Garbage collection,但是iOS平臺不提供。一般我們了解的objective-c對于內(nèi)存管理都是手動操作的,但是也有自動釋放池。但是差了大部分資料,貌似不要和arc機制搞混就好了。求更多~~
17.NSOperation queue?
答案:存放NSOperation的集合類。操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發(fā)的問題。網(wǎng)上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現(xiàn)出。這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執(zhí)行這個是必然的,但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執(zhí)行,因此隊列的概念離亂上有點違背了多線程處理這個概念。但是轉(zhuǎn)念一想其實可以參考銀行的取票和叫號系統(tǒng)。因此對于A比B先排隊取票但是B率先執(zhí)行完操作,我們亦然可以感性認為這還是一個隊列。但是后來看到一票關(guān)于這操作隊列話題的文章,其中有一句提到“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的?!彼查g覺得這個queue名字有點忽悠人了,還不如pool~綜合一點,我們知道他可以比較大的用處在于可以幫組多線程編程就好了。
18.What is lazy loading?
答案:懶漢模式,只在用到的時候才去初始化。也可以理解成延時加載。我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。一個延時載,避免內(nèi)存過高,一個異步加載,避免線程堵塞。
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是否可以關(guān)聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理?
答案:首先我們從代碼來看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實現(xiàn)的。因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源。因此,我覺得可以設(shè)置多個數(shù)據(jù)源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?
21.Object-c的類可以多重繼承么?可以實現(xiàn)多個接口么?重寫一個類的方式用繼承好還是分類好?為什么?
Objective-c只支持單繼承,如果要實現(xiàn)多繼承的話,可以通過類別和協(xié)議的方式來實現(xiàn),cocoa中所有的類都是NSObject的子類,多繼承在這里是用protocol委托代理 來實現(xiàn)的。
22.#import跟#include又什么區(qū)別#import<>跟#import""又什么區(qū)別?
答案:@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文 件中還是需要使用#import而#import比起#include的好處就是不會引起交叉編譯。
24.id聲明的對象有什么特性?
答案:id是個很重要的類型,是個可以指向任何類型的指針或者可以理解為指向任何未知類型的指針。
25.MVC是什么?有什么特性?為什么在iPhone上被廣泛運用?
答案:MVC設(shè)計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表 特別的知識和專業(yè)技能,它們負責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù),而且可能允許用戶對其進行編輯。控制器對象是應(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者。
35.自動釋放池跟GC(垃圾回收)有什么區(qū)別?iPhone上有GC么?[pool release]和[pool drain]有什么區(qū)別?
iPhone上沒有GC。iPhone開發(fā)的時候沒有垃圾回收機制。
在垃圾回收環(huán)境中,release是一個空操作。因此,NSAutoreleasePool提供了drain方法,在引用計數(shù)環(huán)境中,該方法的作用等同于調(diào)用release,但在垃圾回收環(huán)境中,它會觸發(fā)垃圾回收(如果自上次垃圾回收以來分配的內(nèi)存大于當前的閾值)。因此,在通常情況下,您應(yīng)該使用drain而不是release來銷毀自動釋放池。
41.線程與進程的區(qū)別和聯(lián)系?
答案:進程和線程都是由操作系統(tǒng)所體會的程序運行的基本 單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。
程和線程的主要差別在于它們是不同的操作系統(tǒng)資源 管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產(chǎn)生影響,而線程只是一個進程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變
量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一 些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進程。
44.ios平臺怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系?coredata是一個關(guān)系型數(shù)據(jù)庫嗎?
iOS中可以有四種持久化數(shù)據(jù)的方式: 屬性列表、對象歸檔、SQLite3和Core Data;core data可以使你以圖形界面的方式快速的定義app的數(shù)據(jù)模型,同時在你的代碼中容易獲取到它。core data提供了基礎(chǔ)結(jié)構(gòu)去處理常用的功能,例如保存,恢復(fù),撤銷和重做,允許你在app中繼續(xù)創(chuàng)建新的任務(wù)。在使用core data的時候,你不用安裝額外的數(shù)據(jù)庫系統(tǒng),因為core data使用內(nèi)置的sqlite數(shù)據(jù)庫。core data將你app的模型層放入到一組定義在內(nèi)存中的數(shù)據(jù)對象。core data會追蹤這些對象的改變,同時可以根據(jù)需要做相反的改變,例如用戶執(zhí)行撤銷命令。當core data在對你app數(shù)據(jù)的改變進行保存的時候,core data會把這些數(shù)據(jù)歸檔,并永久性保存。
mac
os x中sqlite庫,它是一個輕量級功能強大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序??梢栽诙鄠€平臺使用,sqlite是一個輕量級的嵌入式sql數(shù)據(jù)庫編程。與core data框架不同的是,sqlite是使用程序式的,sql的主要的API來直接操作數(shù)據(jù)表。
Core Data不是一個關(guān)系型數(shù)據(jù)庫,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。雖然Core Dta支持SQLite作為一種存儲類型,但它不能使用任意的SQLite數(shù)據(jù)庫。Core Data在使用的過程種自己創(chuàng)建這個數(shù)據(jù)庫。Core Data支持對一、對多的關(guān)系。
49.unix上進程怎么通信?
UNIX主要支持三種通信方式:
1.基本通信:主要用來協(xié)調(diào)進程間的同步和互斥
(1)鎖文件通信
通信的雙方通過查找特定目錄下特定類型的文件(稱鎖文件)來完成進程間對臨界資源訪問時的互斥;例如進程p1訪問一個臨界資源,首先查看是否有一個特定類型文件,若有,則等待一段時間再查找鎖文件。
(2)記錄鎖文件
2.管道通信:適應(yīng)大批量的數(shù)據(jù)傳遞
3.IPC:適應(yīng)大批量的數(shù)據(jù)傳遞
51.UIscrollVew用到了什么設(shè)計模式?還能再foundation庫中找到類似的嗎?(答案眾多,不知道哪個是對的~~)
模板(Template)模式,所有datasource和delegate接口都是模板模式的典型應(yīng)用,
組合模式composition,所有的container
view都用了這個模式
觀察者模式observer,所有的UIResponder都用了這個模式。
53.
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],執(zhí)行結(jié)果是2.5,&a+1不是首地址+1,系統(tǒng)會認為加一個a數(shù)組的偏 移,是偏移了一個數(shù)組的大?。ū纠?個int,int *ptr=(int *)(&a+1);則ptr實際 是&(a[5]),也就是a+5原因如下:
&a是數(shù)組指針,其類型為int (*)[5];而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。a是長度為5的int數(shù)組指針,所以要加5*sizeof(int)所以ptr實際是a[5],但是prt與(&a+1)類型是不一樣的(這點很重要),所以prt-1只會減去sizeof(int*),a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].
54.以下為Windows NT下的32位C++程序,請計算sizeof的值void Func ( char str[100] )??{??? sizeof(str ) = ???}??void *p = malloc( 100 );?sizeof ( p )= ?
答案:這題 很常見了,Func
( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個指針;在失去其內(nèi)涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺下,指針的長度(占用內(nèi)存的大?。?字節(jié),故sizeof( str )、sizeof
( p )都為4。
55.
-(void)*getNSString(constNSString * inputString)
@"Thisis a main test\n";
return ;}
-main(void)
{NSString*a=@"Main";
NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n",?aString);}
最后問輸出的字符串:NULL,output在 函數(shù)返回后,內(nèi)存已經(jīng)被釋放。
56.列舉幾種進程的同步機制,并比較其優(yōu)缺點。
答案:原子操作信號量機制自旋鎖管程,會合,分布式系統(tǒng)
進程之間通信的途徑
答案:共享存儲系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)
進程死鎖的原因
答案:資源競爭及進程推進順序非法
死鎖的4個必要條 件
答案:互斥、請求保持、不可剝奪、環(huán)路
死鎖的處理
答案:鴕鳥策略、預(yù)防策略、避免策略、檢測與解除死鎖
59.c和obj-c如何混用
1)obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼,處理mm文件可以識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj- c的代碼,因為cpp只是cpp2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題3)在cpp中混用obj- c其實就是使用obj-c編寫的模塊是我們想要的。如果模塊以類實現(xiàn),那么要按照cpp class的標準寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。實現(xiàn)文件中,即類的實現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。如果模塊以函數(shù)實現(xiàn),那么頭文件要按c的格式聲明函數(shù),實現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m??偨Y(jié):只要cpp文件和cpp
include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,而不能直接使用實現(xiàn)代碼,實際上cpp混用的是obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.
60.目標-動作機制
目標是動作消息的接收者。一個控件,或者更為常見的是它的單元,以插座變量(參見"插座變量"部分)的形式保有其動作消息的目標。
動作是控件發(fā)送給目標的消息,或者從目標的角度看,它是目標為了響應(yīng)動作而實現(xiàn)的方法。
程序需要某些機制來進行事件和指令的翻譯。這個機制就是目標-動作機制。
61.cocoa touch框架
iPhone
OS應(yīng)用程序的基礎(chǔ)Cocoa Touch框架重用了許多Mac系統(tǒng)的成熟模式,但是它更多地專注于觸摸的接口和優(yōu)化。UIKit為您提供了在iPhone OS上實現(xiàn)圖形,事件驅(qū)動程序的基本工具,其建立在和Mac OS X中一樣的Foundation框架上,包括文件處理,網(wǎng)絡(luò),字符串操作等。
Cocoa
Touch具有和iPhone用戶接口一致的特殊設(shè)計。有了UIKit,您可以使用iPhone OS上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還可以使用加速儀和多點觸摸手勢來控制您的應(yīng)用。
各色俱全的框架 除了UIKit外,Cocoa Touch包含了創(chuàng)建世界一流iPhone應(yīng)用程序需要的所有框架,從三維圖形,到專業(yè)音效,甚至提供設(shè)備訪問API以控制攝像頭,或通過GPS獲知當前位置。Cocoa Touch既包含只需要幾行代碼就可以完成全部任務(wù)的強大的Objective-C框架,也在需要時提供基礎(chǔ)的C語言API來直接訪問系統(tǒng)。這些框架包括:
CoreAnimation
通過Core
Animation,您就可以通過一個基于組合獨立圖層的簡單的編程模型來創(chuàng)建豐富的用戶體驗。
Core Audio
Core
Audio是播放,處理和錄制音頻的專業(yè)技術(shù),能夠輕松為您的應(yīng)用程序添加強大的音頻功能。
CoreData
提供了一個面向?qū)ο蟮臄?shù)據(jù)管理解決方案,它易于使用和理解,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型。
功能列表:框架分類
下面是Cocoa
Touch中一小部分可用的框架:
?音頻和視頻
?Core Audio
?OpenAL
?Media Library
?AV Foundation
?數(shù)據(jù)管理
?Core Data
?SQLite
?圖形和動畫
?Core Animation
?OpenGL ES
?Quartz 2D
?網(wǎng)絡(luò)/li>
?Bonjour
?WebKit
?BSD Sockets
?用戶應(yīng)用
?Address Book
?Core Location
?Map Kit
?Store Kit
62.objc的內(nèi)存管理
如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創(chuàng)建對象,您就擁有這個對象,需要負責(zé)該對象的釋放。這個規(guī)則在使用NSObject的便利方法new時也同樣適用.
如果您拷貝一個對象,您也擁有拷貝得到的對象,需要負責(zé)該對象的釋放.
如果您保持一個對象,您就部分擁有這個對象,需要在不再使用時釋放該對象。
如果您從其它對象那里接收到一個對象,則您不擁有該對象,也不應(yīng)該釋放它(這個規(guī)則有少數(shù)的例外,在參考文檔中有顯式的說明)。
63.自動釋放池是什么,如何工作
當您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對 象的一個引用放入到最新的自動釋放池。它仍然是個正當?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息。當程序執(zhí)行到作用域結(jié)束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
1.
ojc-c是通過一種"referring
counting"(引用計數(shù))的方式來管理內(nèi)存的,對象在開始分配內(nèi)存(alloc)的時候引用計數(shù)為一,以后每當碰到有copy,retain的時候引用計數(shù)都會加一,每當碰到release和autorelease的時候引用計數(shù)就會減一,如果此對象的計數(shù)變?yōu)榱?,就會被系統(tǒng)銷毀.2. NSAutoreleasePool就是用來做引用計數(shù)的管理工作的,這個東西一般不用你管的.3. autorelease和release沒什么區(qū)別,只是引用計數(shù)減一的時機不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一.
66.動態(tài)綁定—在運行時確定要調(diào)用的方法
動態(tài)綁定將調(diào)用方法的確定也推遲到運行時。在編譯時,方法的調(diào)用并不和代碼綁定在一起,只有在消實發(fā)送出來之后,才確定被調(diào)用的代碼。通過動態(tài)類型和動態(tài)綁定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果。運行時因子負責(zé)確定消息的接 收者和被調(diào)用的方法。運行時的消息分發(fā)機制為動態(tài)綁定提供支持。當您向一個動態(tài)類型確定了的對象發(fā)送消息時,運行環(huán)境系統(tǒng)會通過接收者的isa指針定位對象的類,并以此為起點確定被調(diào)用的方法,方法和消息是動態(tài)綁定的。而且,您不必在Objective-C代碼中做任何工作,就可以自動獲取動態(tài)綁定的好處。您在每次發(fā)送消息時,
特別是當消息的接收者是動態(tài)類型已經(jīng)確定的對象時,動態(tài)綁定就會例行而 透明地發(fā)生。
67.obj-c的優(yōu)缺點
objc優(yōu)點:1)
Cateogies???2) Posing???3)動態(tài)識別4)指標計算5)彈性訊息傳遞6)不是一個過度復(fù)雜的C衍生語言7) Objective-C與C++可混合編程
缺點:?? 1)不支援命名空間2)不支持運算符重載
3) 不支持多重繼承
4) 使用動態(tài)運行時類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。
68.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用?
@property是 一個屬性訪問聲明,擴號內(nèi)支持以下幾個屬性:1,getter=getterName,setter=setterName,設(shè)置setter與getter的方法名2,readwrite,readonly,設(shè)置可供訪問級別2,assign,setter方法直接賦值,不進行 任何retain操作,為了解決原類型與環(huán)循引用問題3,retain,setter方法對參數(shù)進行release舊值再retain新值,所有實現(xiàn)都是這個順序(CC上有相關(guān)資料)4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。5,nonatomic,非原子性訪問,不加同步, 多線程并發(fā)訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對象實例級(我是這么理解的...)。
71.ObjC中,與alloc語義相反的方法是dealloc還是release?與retain語義相反的方法是dealloc還是release,為什么?需要與alloc配對使用的方法是dealloc還是release,為什么?
alloc與dealloc語意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。retain對應(yīng)release,retain保留一個對象。調(diào)用之后,變量的計數(shù)加1?;蛟S不是很明顯,在這有例為證:
- (void)setName : (NSString*) name {
[name retain];
[myname release];
myname = name; }
我們來解釋一下:設(shè)想,用戶在調(diào)用這個函數(shù)的時候,他注意了內(nèi)存的管理,所以他小心的寫了如下代碼:
NSString* newname = [[NSString alloc] initWithString: @"John"];
[aClasssetName: newname];
[newnamerelease];
我們來看一看newname的計數(shù)是怎么變化的。首先,它被alloc,count = 1;然后,在setName中,它被retain,count = 2;最后,用戶自己釋放newname,count
= 1,myname指向了newname。這也解釋了為什么需要調(diào)用[myname release]。我們需要在給myname賦新值的時候,釋放掉以前老的變量。retain之后直接dealloc對象計數(shù)器沒有釋放。alloc需要與release配對使用,因為alloc這個函數(shù)調(diào)用之后,變量的計數(shù)加1。所以在調(diào)用alloc之后,一定要調(diào)用對應(yīng)的release。另外,在release一個變量之后,他的值仍然有效,所以最好是后面緊接著再var = nil。
77.定義屬性時,什么情況使用copy,assign,和retain?
assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,retain和copy用戶對象,copy用于當a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調(diào)用b會crash,如果用copy的方式,a和b各自有自己的內(nèi)存,就可以解決這個問題。retain會使計數(shù)器加一,也可以解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:
if(property != newValue) {?????? [propertyrelease];?????? property = [newValueretain];?? }
78.autorelease的對象是在什么時候被release的?
答:autorelease實際上只是把對release的調(diào)用延遲了,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當前的Autorelease
pool中,當該pool被釋放時,該pool中的所有Object會被調(diào)用Release。對于每一個Runloop,
系統(tǒng)會隱式創(chuàng)建一個Autorelease
pool,這樣所有的release
pool會構(gòu)成一個象CallStack一樣的一個棧式結(jié)構(gòu),在每一個Runloop結(jié)束時,當前棧頂?shù)腁utorelease
pool會被銷毀,這樣這個pool里的每個Object(就是autorelease的對象)會被release。那什么是一個Runloop呢?
一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。那什么是一個Runloop呢?
一個UI事件,Timer call,delegate call, 都會是一個新的Runloop。
79.這段代碼有什么問題,如何修改
for (int i = 0; i < someLargeNumber; i++)
{
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [stringstringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
81. Objective C中的protocal是什么?
@protocal obj里面的協(xié)議就如同java里面的interface。
82. Objective C中的selector是什么?
你可以理解@selector()就是取類方法的編號,他的行為基本可以等同C語言的中函數(shù)指針,只不過C語言中,可以把函數(shù)名直接賦給一個函數(shù)指針,而Objective-C的類不能直接應(yīng)用函數(shù)指針,這樣只能做一個@selector語法來取.它的結(jié)果是一個SEL類型。這個類型本質(zhì)是類方法的編號(函數(shù)地址)。
83. Objective C中的category是什么?
Objective-C提供了一個非常靈活的類(Class)擴展機制-類別(Category)。類別用于對一個已經(jīng)存在的類添加方法(Methods)。你只需要知道這個類的公開接口,不需要知道類的源代碼。需要注意的是,類別不能為已存在的類添加實例變量(Instance Variables)。
子類(subclassing)是進行類擴展的另一種常用方法。與子類相比,類別最主要的優(yōu)點是:系統(tǒng)中已經(jīng)存在的類可以不需修改就可使用類別的擴展功能。
類別的第二大優(yōu)點是實現(xiàn)了功能的局部化封裝。類別定義可以放在一個已存在的類(類A)的定義文件中(.h)。這意味著這個類別只有在類A被引用的前提下才會被外部看到。如果另一個類(類B)不需要用到類A的功能(沒有包含類A的.h文件),也就不會看到依附類A存在的類別。iOS SDK中廣泛運用這種類別定義法來封裝功能。
84.什么是Notification?什么時候用delegate,什么時候用Notification?
觀察者模式,controller向defaultNotificationCenter添加自己的notification,其他類注冊這個notification就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者默認隨機順序發(fā)通知給觀察者們,而且每個觀察者都要等當前的某個觀察者的操作做完才能輪到他來操作,可以用NotificationQueue的方式安排觀察者的反應(yīng)順序,也可以在添加觀察者中設(shè)定反映時間,取消觀察需要在viewDidUnload跟dealloc中都要注銷)。
delegate針對one-to-one關(guān)系,并且reciever可以返回值給sender,notification可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用于sender希望接受到reciever的某個功能反饋值,notification用于通知多個object某個事件。
86. ViewController的loadView, viewDidLoad, viewDidUnload分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做什么工作?
答:viewDidLoad在view從nib文件初始化時調(diào)用,loadView在controller的view為nil時調(diào)用。此方法在編程實現(xiàn)view時調(diào)用,view控制器默認會注冊memory warning notification,當view controller的任何view沒有用的時候,viewDidUnload會被調(diào)用,在這里實現(xiàn)將retain的view release,如果是retain的IBOutlet view屬性則不要在這里release,IBOutlet會負責(zé)release。
87. ViewController的didReceiveMemoryWarning是在什么時候被調(diào)用的?UIViewController類中didReceiveMemoryWarning默認的操作是什么?
69.ViewController的didReceiveMemoryWarning是在什么時候被調(diào)用的?(87題)
答:默認調(diào)用[superdidReceiveMemoryWarning]
88.
UITableViewController中,創(chuàng)建UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什么用?簡述UITableViewCell的復(fù)用原理.
復(fù)用隊列的元素增加:只有在cell被滑動出界面的時候,此cell才會被加入到復(fù)用隊列中。每次在創(chuàng)建cell的時候,程序會首先通過調(diào)用dequeueReusableCellWithIdentifier:cellType方法,到復(fù)用隊列中去尋找標示符為“cellType”的cell,如果找不到,返回nil,然后程序去通過調(diào)用[[[UITableViewCell alloc]
initWithStyle:style reuseIdentifier:cellType] autorelease]來創(chuàng)建標示符為“cellType”的cell。
89. UIView和CALayer有什么區(qū)別?
兩者最大的區(qū)別是,圖層不會直接渲染到屏幕上。
90.消息推送是怎么現(xiàn)實的?
iOS消息推送的工作機制可以簡單的用下圖來概括:
Provider是指某個iPhone軟件的Push服務(wù)器,APNS是Apple Push Notification Service的縮寫,是蘋果的服務(wù)器。
上圖可以分為三個階段:
第一階段:應(yīng)用程序把要發(fā)送的消息、目的iPhone的標識打包,發(fā)給APNS。
第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標識的iPhone,并把消息發(fā)送到iPhone。
第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知。
從上圖我們可以看到:
1、應(yīng)用程序注冊消息推送。
2、iOS從APNS Server獲取device token,應(yīng)用程序接收device token。
3、應(yīng)用程序?qū)evice token發(fā)送給PUSH服務(wù)端程序。
4、服務(wù)端程序向APNS服務(wù)發(fā)送消息。
5、APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序。
91.sdwebimage緩存圖片怎么實現(xiàn)的,在內(nèi)存中有緩存嗎?搜房網(wǎng)
SDWebImage托管在github上。這個類庫提供一個UIImageView類別以支持加載來自網(wǎng)絡(luò)的遠程圖片。具有緩存管理、異步下載、同一個URL下載次數(shù)控制和優(yōu)化等特征。SDWebImage提供了如下三個category來進行緩存。MKAnnotationView(WebCache)、UIButton(WebCache)、UIImageView(WebCache)。
SDImageCache類提供一個創(chuàng)建空緩存的實例,并用方法imageForKey:來尋找當前緩存。UIImage *myCachedImage = [[SDImageCache sharedImageCache]
imageFromKey:myCacheKey];存儲一個圖像到緩存是使用方法storeImage:
forKey:默認情況下,圖像將被存儲在內(nèi)存緩存和磁盤緩存中。如果僅僅是想內(nèi)存緩存中,要使用storeImage:forKey:toDisk:方法的第三個參數(shù)帶一負值來替代。
92.你單例怎么理解怎么用的?搜房網(wǎng)
Singleton Pattern單例設(shè)計模式,通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。類只能有一個實例,而且必須從一個為人熟知的訪問點對其進行訪問,比如工廠方法。這個唯一的實例只能通過子類化進行擴展,而且擴展的對象不會破壞客戶端代碼。例如,UIApplication的sharedApplication方法,任何時候都會返回一個當前應(yīng)用程序的UIApplication實例。在程序中,我需要一系列的對象,他們每一個內(nèi)部都包含有一組變量和功能,是靜態(tài)的,而且整個程序都只需要擁有一個該類的對象。例如:1.控制程序執(zhí)行的命令器;2.管理數(shù)據(jù)庫;3.音效控制;4.文件處理
93、運行時你是怎么理解的,怎么用的?搜房網(wǎng)
ObjC Runtime其實是一個Runtime庫,基本上用C和匯編寫的,這個庫使得C語言有了面向?qū)ο蟮哪芰ΓX中浮現(xiàn)當你喬幫主參觀了施樂帕克的SmallTalk之后嘴角一抹淺笑)。這個庫做的事前就是加載類的信息,進行方法的分發(fā)和轉(zhuǎn)發(fā)之類的。OC是一種面向runtime(運行時)的語言,也就是說,它會盡可能地把代碼執(zhí)行的決策從編譯和鏈接的時候,推遲到運行時。這給程序員寫代碼帶來很大的靈活性,比如說你可以把消息轉(zhuǎn)發(fā)給你想要的對象,或者隨意交換一個方法的實現(xiàn)之類的。這就要求runtime能檢測一個對象是否能對一個方法進行響應(yīng),然后再把這個方法分發(fā)到對應(yīng)的對象去。我們拿C來跟ObjC對比一下。在C語言里面,一切從main函數(shù)開始,程序員寫代碼的時候是自上而下地,一個C的結(jié)構(gòu)體或者說類吧,是不能把方法調(diào)用轉(zhuǎn)發(fā)給其他對象的。這個問題其實淺涉及到兩個概念,運行時和多態(tài)。簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器。因此也可以說,運行時機制是多態(tài)的基礎(chǔ)。比如KVO中我們就用了。
95.http的post與get區(qū)別與聯(lián)系,實踐中如何選擇它們?
(1)get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。
(2)在客戶端,Get方式在通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到;POST方式,數(shù)據(jù)放置在HTML HEADER內(nèi)提交。
(3)對于get方式,服務(wù)器端用Request.QueryString獲取變量的值,對于post方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。
(4)GET方式提交的數(shù)據(jù)最多只能有1024字節(jié),而POST則沒有此限制。
(5)安全性問題。正如在(1)中提到,使用Get的時候,參數(shù)會顯示在地址欄上,而Post不會。所以,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù),那么使用get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用post為好。
Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用于描述一個網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就對應(yīng)著對這個資源的查,改,增,刪4個操作。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。
96.檢查內(nèi)存管理問題的方式有哪些?
1)點擊Xcode頂部菜單中的ProductàAnalyze。這種方法主要可以查看內(nèi)存泄露,變量未初始化,變量定義后沒有被使用到
2)使用Instrument工具檢查。點擊Xcode頂部菜單中的ProductàProfile,彈出一個界面,選擇左側(cè)的Memory后,再選右側(cè)的Leaks。
3)人工檢查
97.NSString對象為何用copy?NSMutableString呢?
NSString在Objective-C中是一種非常特殊的對象,其引用系數(shù)不受引用計數(shù)規(guī)則的控制。NSString對象不管是alloc、retain還是release,其引用計數(shù)都是-1。對于NSString來說,用alloc和用retain都是指向同一塊內(nèi)存,區(qū)別不大。對于NSMutableString來說,alloc實際上就是開辟了一塊新內(nèi)存,再把內(nèi)容復(fù)制進來,而retain內(nèi)存不變引用計數(shù)+1。如果NSMutableString中的內(nèi)容被改變了的話,用retain之后內(nèi)容也被改變。這是寫程序過程中所不想要的結(jié)果。所以這種情況下,用copy比較安全。蘋果的官方SDK,都把NSString屬性聲明為copy,比如UILabel中的兩個屬性。
98.談?wù)刼bj-c的優(yōu)缺點?
優(yōu)點:
1) Cateogies
2) Posing
3)動態(tài)識別
4)指標計算
5)彈性訊息傳遞
6)不是一個過度復(fù)雜的C衍生語言
7) Objective-C與C++可混合編程
缺點:
1)不支援命名空間機制:須在其類別名稱加上前綴,時常引致沖突。
2)不支持運算符重載
3)不支持多重繼承:只容許對象繼承一個類別
4)使用動態(tài)運行時類型,所有的方法都是函數(shù)調(diào)用,很多常見的編譯時性能優(yōu)化方法都不能應(yīng)用于Obj-C(如內(nèi)聯(lián)函數(shù)、常數(shù)傳播、交互式優(yōu)化、純量取代與聚集等),性能劣于類似的對象抽象語言(如C++)。
99.堆和棧的區(qū)別?
1.申請大?。?/p>
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴?系統(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
2.碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應(yīng),以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出
3.分配方式:堆都是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配,但是棧的動態(tài)分配和堆是不同的,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。
4.分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的,它的機制是很復(fù)雜的。
100.obj-c有多重繼承么?不是的話有什么替代方法?
cocoa中所有的類都是NSObject的子類,多繼承在這里是用protocol委托代理來實現(xiàn)的。你不用去考慮繁瑣的多繼承,虛基類的概念。多態(tài)特性在obj-c中通過委托來實現(xiàn)。
101.#import跟#include、@class有什么區(qū)別?#import<>跟#import”"又什么區(qū)別?
1>#import和#include都能完整地包含某個文件的內(nèi)容,#import能防止同一個文件被包含多次
2>@class僅僅是聲明一個類名,并不會包含類的完整聲明;@class還能解決循環(huán)包含的問題
3>#import <>用來包含系統(tǒng)自帶的文件,#import
“”用來包含自定義的文件
102.What are KVO and KVC?
1>KVC是鍵值編碼,可以通過一個字符串的key(屬性名)修改對象的屬性值
2>KVO是鍵值監(jiān)聽,可以監(jiān)聽一個對象屬性值的改變
103.ViewController的loadView、viewDidLoad、viewDidUnload分別是什么時候調(diào)用的,在自定義ViewCointroller時在這幾個函數(shù)中應(yīng)該做什么工作?
1>loadView
?當?shù)谝淮问褂每刂破鞯膙iew時,會調(diào)用loadView方法創(chuàng)建view
?一般在這里自定義view
2>viewDidLoad
?當控制器的view創(chuàng)建完畢時會調(diào)用,也就是在loadView后調(diào)用
?一般在這里添加子控件、初始化數(shù)據(jù)
3>viewDidUnload
?當控制器的view因為內(nèi)存警告被銷毀時調(diào)用
?一般在這里回收跟界面相關(guān)的資源(界面都會銷毀了,跟界面相關(guān)的資源肯定不要了)
104..寫一個NSString類的實現(xiàn)
+?(id)initWithCString:(const
char*)nullTerminatedCString encoding:(NSStringEncoding)encoding{
NSString*obj;
obj= [self
allocWithZone: NSDefaultMallocZone()];
obj= [obj
initWIthCString: nullTerminatedCString encoding: encoding];
returnAUTORELEASE(obj);
}
105..寫一個委托的interface
@protocolMyDelegate;
@interfaceMyClass: NSObject
{
id delegate;
}
//委托方法
@protocol?MyDelegate
-(void)didJobs:(NSArray *)args;
@end
106.請寫出obj-c的內(nèi)存管理代碼
方法描述-retain將一個對象的reference數(shù)量增加1。
-release將一個對象的reference數(shù)量減少1。
-autorelease在未來某些時候?qū)eference數(shù)量減少1.
-alloc為一個對象分配內(nèi)存,并設(shè)置保留值數(shù)量(retain count)為1。
-copy復(fù)制一個對象,并將其做為返回值。同時設(shè)置保留值數(shù)量(retain count)為1。
107.自動釋放池是什么,如何工作
當向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息。當程序執(zhí)行到作用域結(jié)束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
108.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用
答:@property是一個屬性訪問聲明,擴號內(nèi)支持以下幾個屬性:答:
1,getter=getterName,setter=setterName,設(shè)置setter與getter的方法名2,readwrite,readonly,設(shè)置可供訪問級別2,assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環(huán)循引用問題3,retain,setter方法對參數(shù)進行release舊值再retain新值,所有實現(xiàn)都是這個順序(CC上有相關(guān)資料)4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。5,nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對象實例級。
109.OOP
OOP是一種用于解決問題的編程方法或通用方法。與之相反,算法是用于解決特定問題的特定方法。OOP天生是一種強有力的方法;它往往使過程型和函數(shù)型編程方法與該問題較少相關(guān),并且除非它與過程型和函數(shù)型編程方法的混合對其極其有益,否則它們之間不會很好地結(jié)合在一起。
通常,有三個語言特性是OOP編程語言所必需的。它們是繼承、多態(tài)性和封裝。
有兩種繼承:單一繼承和多重繼承。單一繼承要求子對象只有一個父對象,而多重繼承更自由(與實際生活一樣,在編程過程中具有兩個以上的父對象會導(dǎo)致混亂并使子對象難以工作,因此,不要過多使用多重繼承)。盡管兩個或兩個以上的父對象實際上很少見,但Perl支持多重繼承。
多態(tài)性(來自希臘語,表示“很多形態(tài)”)是使一個對象被看成另一個對象的技術(shù)。這有點復(fù)雜,那么我舉個例子。比方說,您有一個綿羊牧場,里面有四只綿羊(綿羊?qū)伲悄鷦倓傎I了兩只山羊(山羊?qū)伲┖鸵恢坏聡裂蛉ㄈ迫畬伲?。您一共有多少動物?您得把所有的綿羊、山羊和狗加起來,結(jié)果是7只。其實您剛剛應(yīng)用了多態(tài)性,即為了計算,把三種不同種類的動物當成一種通用類型(“動物”)對待。如果您把綿羊、山羊和狗當成哺乳動物看待,這就是一個簡單的信心飛躍。生物學(xué)家每天都以這種方式使用多態(tài)性,而程序員則以從其它科學(xué)領(lǐng)域“竊用”(我是指“重用”)好主意聞名。封裝指的是以這樣一種方式包含對象行為和特性:除非對象作者允許,否則用戶無法訪問該對象的行為和特性。在這種方式下,對象用戶無法做不準他們做的事,無法訪問不準他們訪問的數(shù)據(jù),并且通常是有害數(shù)據(jù)。
110.自動釋放池寫在循環(huán)內(nèi)好,還是寫在循環(huán)外好?
如果新建自己的pool可根據(jù)情況選擇放的位置,循環(huán)次數(shù)少可放在外面,次數(shù)多放在里面,這樣不用等循環(huán)結(jié)束就可以進行釋放了。如果覺得pool每次alloc和dealloc不舒服,可以每循環(huán)幾次做一下。如果用系統(tǒng)本身的pool,就把變量盡量放在外面。
111.類工廠方法是什么
類工廠方法的實現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創(chuàng)建的對象,并
進行自動釋放處理。這些方法的形式是+ (type)className...(其中className不包括任何前綴)。
工廠方法可能不僅僅為了方便使用。它們不但可以將分配和初始化合在一起,還可以為初始化過程提供對
象的分配信息。
類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init...方法可以確認一
個類在每次程序運行過程只存在一個實例,但它需要首先分配一個“生的”實例,然后還必須釋放該實例。
工廠方法則可以避免為可能沒有用的對象盲目分配內(nèi)存。
112.動態(tài)綁定
—在運行時確定要調(diào)用的方法
動態(tài)綁定將調(diào)用方法的確定也推遲到運行時。在編譯時,方法的調(diào)用并不和代碼綁定在一起,只有在消實發(fā)送出來之后,才確定被調(diào)用的代碼。通過動態(tài)類型和動態(tài)綁定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果。運行時因子負責(zé)確定消息的接收者和被調(diào)用的方法。運行時的消息分發(fā)機制為動態(tài)綁定提供支持。當您向一個動態(tài)類型確定了的對象發(fā)送消息時,運行環(huán)境系統(tǒng)會通過接收者的isa指針定位對象的類,并以此為起點確定被調(diào)用的方法,方法和消息是動態(tài)綁定的。而且,您不必在Objective-C代碼中做任何工作,就可以自動獲取動態(tài)綁定的好處。您在每次發(fā)送消息時,特別是當消息的接收者是動態(tài)類型已經(jīng)確定的對象時,動態(tài)綁定就會例行而透明地發(fā)生。
113.ios對象的生命周期?
對象的生命周期—即對象在運行時從創(chuàng)建到銷毀的過程—取決于對象接收到的各種消息。當程序顯式分配并初始化一個對象(或者復(fù)制另外一個對象)之后,對象就誕生了。當您從檔案字節(jié)流解碼出某個對象的時候,對象就開始其運行時的生命。如果對象從nib文件里面解檔而來,當nib文件所有對象被加載到內(nèi)存后,該對象會接收到一條awakeFromNib消息。
在創(chuàng)建和初始化完成后,只要對象保持數(shù)量大于零,就會停留在內(nèi)存。程序中的其他對象可向其發(fā)送retain消息或者復(fù)制該對象,以此來擁有該對象。稍后它們可以向?qū)ο蟀l(fā)送release消息,這樣就可以撤銷擁有權(quán)。當對象接收到最后一條release消息后,其保持數(shù)量會下降至零,這時,對象的dealloc被調(diào)用。該方法將會釋放對象持有的全部對象以及所分配的內(nèi)存,然后這個對象會被銷毀。