面試題一

一绞铃、(一共三十題)

1.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)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大蟹贫堋(本例是5個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].

2.以下為Windows NT下的32位C++程序间聊,請計算sizeof的值

void Func ( char str[100])

{sizeof( str ) = ?}

void *p = malloc( 100 );

sizeof ( p ) = ?

答案:sizeof( str )、sizeof ( p )都為4抵拘。

3.還是考指針,不過我對cocoa的代碼還是不太熟悉大概是這樣的- NSString *getNSString(void)

{

NSString *output=@"Thisis a main test\n";

return output;

}

-main(void)

{NSString *a=@"Main";

NSString *aString = [NSStringstringWithString:@"%@",getNSString(a)];NSLog(@"%@\n", aString);

}

答案:最后問輸出的字符串:NULL哎榴,output在函數(shù)返回后,內(nèi)存已經(jīng)被釋放僵蛛。

4.用預(yù)處理指令#define聲明一個常數(shù)尚蝌,用以表明1年中有多少秒(忽略閏年問題)寫一個"標(biāo)準(zhǔn)"宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個墩瞳。

答案:#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

5.寫一個委托的interface

答案:@protocol MyDelegate;

@interface MyClass: NSObject

{

id delegate;

}

//委托方法

@protocol?MyDelegate

- (void)didJobs:(NSArray*)args;

@end

6.寫一個NSString類的實現(xiàn)-(id)initWithCString:(const char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding; -(void)dealloc;

答案:+ (id) stringWithCString:(const char*)nullTerminatedCString

encoding: (NSStringEncoding)encoding

{

NSString*obj;

obj = [self allocWithZone:NSDefaultMallocZone()];

obj = [obj initWithCString:nullTerminatedCString encoding: encoding];

return AUTORELEASE(obj);

}

7.obj-c有多重繼承么?不是的話有什么替代方法?

答案:cocoa中所有的類都是NSObject的子類驼壶,多繼承在這里是用protocol委托代理來實現(xiàn)的氏豌,你不用去考慮繁瑣的多繼承,虛基類的概念.ood的多態(tài)特性在obj-c中通過委托來實現(xiàn).

8.obj-c有私有方法么?私有變量呢

答案:objective-c -類里面的方法只有兩種,靜態(tài)方法和實例方法

在Objective‐C中喉酌,所有實例變量默認(rèn)都是受保護(hù)的,所有實例方法默認(rèn)都是公有的

9.關(guān)鍵字const有什么含意泵喘?關(guān)鍵字volatile有什么含意?并給出三個不同的例子泪电。static關(guān)鍵字的作用,extern "C"的作用

答案:const意味著"只讀"纪铺,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的相速。

關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實際上鲜锚,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的突诬。如果

你曾花很多時間清理其它人留下的垃圾苫拍,你就會很快學(xué)會感謝這點多余的信息。(當(dāng)然旺隙,懂得用const的程序員很少會留下的垃圾讓別人來清

理的绒极。)

通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼蔬捷。

合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù)垄提,防止其被無意的代碼修改。簡而言之周拐,這樣可以減少bug的出現(xiàn)铡俐。

(1)欲阻止一個變量被改變,可以使用const關(guān)鍵字妥粟。在定義該const變量時审丘,通常需要對它進(jìn)行初

始化,因為以后就沒有機(jī)會再去改變它了罕容;

(2)對指針來說备恤,可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const锦秒,或二者同時指

定為const露泊;

(3)在一個函數(shù)聲明中,const可以修飾形參旅择,表明它是一個輸入?yún)?shù)惭笑,在函數(shù)內(nèi)部不能改變其值;

(4)對于類的成員函數(shù)生真,若指定其為const類型沉噩,則表明其是一個常函數(shù),不能修改類的成員變量柱蟀;

(5)對于類的成員函數(shù)川蒙,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”长已。

static關(guān)鍵字的作用:

(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體畜眨,不同于auto變量,該變量的內(nèi)存只被分配一次术瓮,

因此其值在下次調(diào)用時仍維持上次的值康聂;

(2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問胞四;

(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用恬汁,這個函數(shù)的使用范圍被限制在聲明

它的模塊內(nèi);

(4)在類中的static成員變量屬于整個類所擁有辜伟,對類的所有對象只有一份拷貝氓侧;

(5)在類中的static成員函數(shù)屬于整個類所擁有脊另,這個函數(shù)不接收this指針,因而只能訪問類的static成員變量约巷。

extern "C"的作用

(1)被extern

"C"限定的函數(shù)或變量是extern類型的尝蠕;

extern是C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器载庭,

其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用看彼。

(2)被extern

"C"修飾的變量和函數(shù)是按照C語言方式編譯和連接的;

extern "C"的慣用法

(1)在C++中引用C語言中的函數(shù)和變量囚聚,在包含C語言頭文件(假設(shè)為cExample.h)時靖榕,需進(jìn)行下列處理:

extern "C"

{#include "cExample.h"}

而在C語言的頭文件中,對其外部函數(shù)只能指定為extern類型顽铸,C語言中不支持extern "C"聲明茁计,在.c文件中包含了extern "C"時會出現(xiàn)編譯語法錯誤。

(2)在C中引用C++語言中的函數(shù)和變量時谓松,C++的頭文件需添加extern "C"星压,但是在C語言中不

能直接引用聲明了extern "C"的該頭文件,應(yīng)該僅將C文件中將C++中定義的extern "C"函數(shù)聲明為extern類型鬼譬。

10.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)娜膘?#ifndef __INCvxWorksh#define __INCvxWorksh#ifdef __cplusplusextern "C" {#endif/*...*/#ifdef __cplusplus}#endif#endif /*__INCvxWorksh */

答案:顯然,頭文件中的編譯宏“#ifndef __INCvxWorksh优质、#define __INCvxWorksh竣贪、#endif”的作用是防止該頭文件被重復(fù)引用。

11.#import跟#include的區(qū)別,@class呢?

答案:@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到巩螃,在m文件中還是需要使用#import而#import比起#include的好處就是不會引起交叉編譯

12.MVC模式的理解

答案:MVC設(shè)計模式考慮三種對象:模型對象演怎、視圖對象、和控制器對象避乏。模型對象代表特別的知識和專業(yè)技能爷耀,它們負(fù)責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù)拍皮,而且可能允許用戶對其進(jìn)行編輯歹叮。控制器對象是應(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者春缕。

13.線程與進(jìn)程的區(qū)別和聯(lián)系?線程是否具有相同的堆棧? dll是否有獨立的堆棧?

答案:進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運(yùn)行的基本單元盗胀,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性艘蹋。

進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式锄贼。進(jìn)程有獨立的地址空間,一個進(jìn)程崩潰后女阀,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響宅荤,而線程只是一個進(jìn)程中的不同執(zhí)行路徑屑迂。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間冯键,一個線程死掉就等于整個進(jìn)程死掉惹盼,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時惫确,耗費資源較大手报,效率要差一些。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作改化,只能用線程掩蛤,不能用進(jìn)程。

14.列舉幾種進(jìn)程的同步機(jī)制陈肛,并比較其優(yōu)缺點揍鸟。進(jìn)程之間通信的途徑進(jìn)程死鎖的原因死鎖的4個必要條件死鎖的處理

答案:同步機(jī)制:原子操作,信號量機(jī)制句旱,自旋鎖阳藻,管程,會合谈撒,分布式系統(tǒng)

進(jìn)程之間通信的途徑:共享存儲系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)

進(jìn)程死鎖的原因:資源競爭及進(jìn)程推進(jìn)順序非法

死鎖的4個必要條件:互斥腥泥、請求保持、不可剝奪啃匿、環(huán)路

死鎖的處理:鴕鳥策略道川、預(yù)防策略、避免策略立宜、檢測與解除死鎖

15.堆和棧的區(qū)別

答案:管理方式:對于棧來講冒萄,是由編譯器自動管理,無需我們手工控制橙数;對于堆來說尊流,釋放工作由程序員控制,容易產(chǎn)生memory leak。

申請大忻壳俊:棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)膨桥,是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的迎献,在WINDOWS下,棧的大小是2M(也有的說是1M腻贰,總之是一個編譯時就確定的常數(shù))吁恍,如果申請的空間超過棧的剩余空間時,將提示overflow。因此冀瓦,能從棧獲得的空間較小伴奥。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域翼闽。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的拾徙,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址感局。堆的大小受限于計算機(jī)系統(tǒng)中有效的虛擬內(nèi)存尼啡。由此可見,堆獲得的空間比較靈活询微,也比較大玄叠。

碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù)拓提,從而造成大量的碎片读恃,使程序效率降低。對于棧來講代态,則不會存在這個問題寺惫,因為棧是先進(jìn)后出的隊列,他們是如此的一一對應(yīng)蹦疑,以至于永遠(yuǎn)都不可能有一個內(nèi)存塊從棧中間彈出

分配方式:堆都是動態(tài)分配的西雀,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配歉摧。靜態(tài)分配是編譯器完成的艇肴,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進(jìn)行分配叁温,但是棧的動態(tài)分配和堆是不同的再悼,他的動態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實現(xiàn)膝但。

分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)冲九,計算機(jī)會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行跟束,這就決定了棧的效率比較高莺奸。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的冀宴。

16.什么是鍵-值,鍵路徑是什么

答案:模型的性質(zhì)是通過一個簡單的鍵(通常是個字符串)來指定的灭贷。視圖和控制器通過鍵來查找相應(yīng)的屬性值。在一個給定的實體中略贮,同一個屬性的所有值具有相同的數(shù)據(jù)類型甚疟。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對象屬性的機(jī)制仗岖。

鍵路徑是一個由用點作分隔符的鍵組成的字符串,用于指定一個連接在一起的對象性質(zhì)序列古拴。第一個鍵的性質(zhì)是由先前的性質(zhì)決定的,接下來每個鍵的值也是相對于其前面的性質(zhì)真友。鍵路徑使您可以以獨立于模型實現(xiàn)的方式指定相關(guān)對象的性質(zhì)黄痪。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑盔然,使其指向相關(guān)對象的特定屬性桅打。

17.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只是cpp。

2)在mm文件中混用cpp直接使用即可恢准,所以obj-c混cpp不是問題

3)在cpp中混用obj- c其實就是使用obj-c編寫的模塊是我們想要的魂挂。

如果模塊以類實現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義馁筐,頭文件中不能出現(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轮锥。

總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口要尔,而不能直接使用實現(xiàn)代碼舍杜,實際上cpp混用的是obj-c編譯后的o文件,這個東西其實是無差別的赵辕,所以可以用既绩。obj-c的編譯器支持cpp.

18.目標(biāo)-動作機(jī)制

答案:目標(biāo)是動作消息的接收者。一個控件还惠,或者更為常見的是它的單元饲握,以插座變量(參見"插座變量"部分)的形式保有其動作消息的目標(biāo)。

動作是控件發(fā)送給目標(biāo)的消息,或者從目標(biāo)的角度看救欧,它是目標(biāo)為了響應(yīng)動作而實現(xiàn)的方法衰粹。程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個機(jī)制就是目標(biāo)-動作機(jī)制笆怠。

19.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獲知當(dāng)前位置。Cocoa Touch既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的Objective-C框架混卵,也在需要時提供基礎(chǔ)的C語言API來直接訪問系統(tǒng)映穗。這些框架包括:

Core Animation:通過Core Animation,您就可以通過一個基于組合獨立圖層的簡單的編程模型來創(chuàng)建豐富的用戶體驗幕随。

Core Audio:Core Audio是播放蚁滋,處理和錄制音頻的專業(yè)技術(shù),能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能赘淮。

Core Data:提供了一個面向?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>:onjour塞绿、WebKit沟涨、BSD Sockets

用戶應(yīng)用:Address Book、Core Location异吻、ap Kit裹赴、tore Kit

20.objc的內(nèi)存管理

答案:1、如果您通過分配和初始化(比如[[MyClass alloc]

init])的方式來創(chuàng)建對象涧黄,您就擁有這個對象篮昧,需要負(fù)責(zé)該對象的釋放赋荆。這個規(guī)則在使用NSObject的便利方法new時也同樣適用笋妥。

2、如果您拷貝一個對象窄潭,您也擁有拷貝得到的對象春宣,需要負(fù)責(zé)該對象的釋放。

3嫉你、如果您保持一個對象月帝,您就部分擁有這個對象,需要在不再使用時釋放該對象幽污。反過來嚷辅,如果您從其它對象那里接收到一個對象,則您不擁有該對象距误,也不應(yīng)該釋放它(這個規(guī)則有少數(shù)的例外簸搞,在參考文檔中有顯式的說明)。

21.自動釋放池是什么,如何工作

答案:當(dāng)您向一個對象發(fā)送一個autorelease消息時准潭,Cocoa就會將該對象的一個引用放入到最新的自動釋放池趁俊。它仍然是個正當(dāng)?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息刑然。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時寺擂,自動釋放池就會被釋放,池中的所有對象也就被釋放泼掠。

1.ojc-c是通過一種"referring counting"(引用計數(shù))的方式來管理內(nèi)存的,對象在開始分配內(nèi)存(alloc)的時候引用計數(shù)為一,以后每當(dāng)碰到有copy,retain的時候引用計數(shù)都會加一,每當(dāng)碰到release和autorelease的時候引用計數(shù)就會減一,如果此對象的計數(shù)變?yōu)榱?,系統(tǒng)才會調(diào)用dealloc真正銷毀這個對象.

2. NSAutoreleasePool就是用來做引用計數(shù)的管理工作的,這個東西一般不用你管的.

3. autorelease和release沒什么區(qū)別,只是引用計數(shù)減一的時機(jī)不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一.

22.類工廠方法是什么(就是便利構(gòu)造器)

答案:類工廠方法的實現(xiàn)是為了向客戶提供方便怔软,它們將分配和初始化合在一個步驟中,返回被創(chuàng)建的對象择镇,并進(jìn)行自動釋放處理爽雄。這些方法的形式是+ (type)className...(其中className不包括任何前綴)。

工廠方法可能不僅僅為了方便使用沐鼠。它們不但可以將分配和初始化合在一起挚瘟,還可以為初始化過程提供對象的分配信息叹谁。

類工廠方法的另一個目的是使類(比如NSWorkspace)提供單件實例。雖然init...方法可以確認(rèn)一個類在每次程序運(yùn)行過程只存在一個實例乘盖,但它需要首先分配一個“生的”實例焰檩,然后還必須釋放該實例。

工廠方法則可以避免為可能沒有用的對象盲目分配內(nèi)存订框。

23.單件實例是什么

答案:Foundation和Application Kit框架中的一些類只允許創(chuàng)建單件對象析苫,即這些類在當(dāng)前進(jìn)程中的唯一實例。舉例來說穿扳,NSFileManager和NSWorkspace類在使用時都是基于進(jìn)程進(jìn)行單件對象的實例化衩侥。當(dāng)向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用矛物,如果該實例還不存在茫死,則首先進(jìn)行實例的分配和初始化。單件對象充當(dāng)控制中心的角色履羞,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)峦萎。如果類在概念上只有一個實例(比如NSWorkspace),就應(yīng)該產(chǎn)生一個單件實例忆首,而不是多個實例爱榔;如果將來某一天可能有多個實例,您可以使用單件實例機(jī)制糙及,而不是工廠方法或函數(shù)详幽。

24.動態(tài)綁定

答案:動態(tài)綁定——在運(yùn)行時確定要調(diào)用的方法。動態(tài)綁定將調(diào)用方法的確定也推遲到運(yùn)行時浸锨。在編譯時唇聘,方法的調(diào)用并不和代碼綁定在一起,只有在消實發(fā)送出來之后揣钦,才確定被調(diào)用的代碼雳灾。通過動態(tài)類型和動態(tài)綁定技術(shù),您的代碼每次執(zhí)行都可以得到不同的結(jié)果冯凹。運(yùn)行時因子負(fù)責(zé)確定消息的接收者和被調(diào)用的方法谎亩。運(yùn)行時的消息分發(fā)機(jī)制為動態(tài)綁定提供支持。當(dāng)您向一個動態(tài)類型確定了的對象發(fā)送消息時宇姚,運(yùn)行環(huán)境系統(tǒng)會通過接收者的isa指針定位對象的類匈庭,并以此為起點確定被調(diào)用的方法,方法和消息是動態(tài)綁定的浑劳。而且阱持,您不必在Objective-C代碼中做任何工作,就可以自動獲取動態(tài)綁定的好處魔熏。您在每次發(fā)送消息時衷咽,特別是當(dāng)消息的接收者是動態(tài)類型已經(jīng)確定的對象時鸽扁,動態(tài)綁定就會例行而透明地發(fā)生。

25.obj-c的優(yōu)缺點

答案:objc優(yōu)點:1) Cateogies 2) Posing()3)動態(tài)識別4)指標(biāo)計算5)彈性訊息傳遞6)不是一個過度復(fù)雜的C衍生語言7) Objective-C與C++可混合編程

缺點: 1)不支援命名空間2)不支持運(yùn)算符重載3)不支持多重繼承4)使用動態(tài)運(yùn)行時類型镶骗,所有的方法都是函數(shù)調(diào)用桶现,所以很多編譯時優(yōu)化方法都用不到。(如內(nèi)聯(lián)函等)鼎姊,性能低劣骡和。

26.sprintf,strcpy,memcpy使用上有什么要注意的地方

答案:strcpy是一個字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char *dst,

const char *src);將src開始的一段字符串拷貝到dst開始的內(nèi)存中去相寇,結(jié)束的標(biāo)志符號為'\0'慰于,由于拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯唤衫。

具備字符串拷貝功能的函數(shù)有memcpy婆赠,這是一個內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char *dst, const

char* src, unsigned int len);將長度為len的一段內(nèi)存战授,從src拷貝到dst中去页藻,這個函數(shù)的長度可控桨嫁。但是會有內(nèi)存疊加的問題植兰。

sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式璃吧,格式化到一個字符串緩沖區(qū)中去楣导。sprintf格式化的函數(shù)的長度不可控,有可能格式化后的字符串會超出緩沖區(qū)的大小畜挨,造成溢出筒繁。

27.用變量a給出下面的定義

a)一個整型數(shù)(An integer)

b)一個指向整型數(shù)的指針(A pointer to an integer)

c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)(A pointer to a

pointer to an intege)r

d)一個有10個整型數(shù)的數(shù)組(An array of 10 integers)

e)一個有10個指針的數(shù)組巴元,該指針是指向一個整型數(shù)的毡咏。(An array of 10

pointers to integers)

f)一個指向有10個整型數(shù)數(shù)組的指針(A pointer to an array of 10

integers)

g)一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to afunction that takes an integer as an argumentand returns an integer)

h)一個有10個指針的數(shù)組逮刨,該指針指向一個函數(shù)呕缭,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(An array of ten

pointers to functions t hat take an integer argument and return an integer)

答案:

a) int a; // An integer

b) int *a; // A pointer toan integer

c) int **a; // A pointer toa pointer to an integer

d) int a[10]; // An array of10 integers

e) int *a[10]; // An arrayof 10 pointers to integers

f) int (*a)[10]; // Apointer to an array of 10 integers

g) int (*a)(int); // A pointerto a function a thattakes an integerargument and returns an integer

h) int (*a[10])(int); // Anarray of 10 pointers to functionsthattake an integer argument and return an integer

28.cocoa有哪些設(shè)計模式?

答案:

29.socket編程中如何判斷異步connect是否成功

答案:創(chuàng)建一個socket,設(shè)為異步socket(fcntl),將socket加入epoll,connect到遠(yuǎn)端(此時connect調(diào)用返回非0,但errno為EINPROGRESS修己,表示正在建立連接中)

epoll_wait之捕獲到EPOLLOUT事件恢总,此時便認(rèn)為connect已經(jīng)成功,client端開始發(fā)消息

這個過程通常能夠運(yùn)轉(zhuǎn)睬愤,但是線上環(huán)境復(fù)雜多變片仿,如果發(fā)生這種情況:server進(jìn)程調(diào)用listen開始偵聽后,被gdb或信號掛住了尤辱,此時異步connect會怎樣砂豌?很遺憾厢岂,client端的epoll_wait依然返回EPOLLOUT,甚至往此socket里發(fā)消息都返回成功阳距,只有當(dāng)發(fā)的消息多得占完了server端的tcp緩沖以后(窗口收縮到很羞湫Α),send調(diào)用才開始失敗娄涩。這時候用losf -i看網(wǎng)絡(luò)連接也很有趣窗怒,client端的機(jī)器顯示連接建立了,server端的卻顯示沒有這個連接蓄拣。

仔細(xì)想想扬虚,OS這樣做是正確的,畢竟connect的語義只是“連接”球恤,當(dāng)server掛住時辜昵,連接還是能成功的,但你能不能往里面發(fā)消息那就是另外一回事了咽斧。

所以對于應(yīng)用來說堪置,異步socket想要知道connect后連接是不是可以正常收發(fā)數(shù)據(jù)了,還是要靠應(yīng)用層的一問一答才能知道张惹。

30.[[[nil

retain]retain]release]有什么問題

答案:沒有問題

31.cocoa架構(gòu)

答案:

32.readwrite舀锨,readonly,assign宛逗,retain坎匿,copy,nonatomic屬性的作用

答案:@property是 一個屬性訪問聲明雷激,擴(kuò)號內(nèi)支持以下幾個屬性:

1.getter=getterName替蔬,setter=setterName,設(shè)置setter與getter的方法名

2.readwrite,readonly屎暇,設(shè)置可供訪問級別

3.assign承桥,setter方法直接賦值,不進(jìn)行 任何retain操作根悼,為了解決原類型與環(huán)循引用問題

4.retain凶异,setter方法對參數(shù)進(jìn)行release舊值再retain新值,所有 實現(xiàn)都是這個順序(CC上有相關(guān)資料)

5.copy番挺,setter方法進(jìn)行Copy操作唠帝,與retain處理流程一樣,先舊值release玄柏,再Copy出新的對象襟衰,retainCount為1。這是為了減少對上下文的依賴而引入的機(jī)制粪摘。

6.nonatomic绍坝,非原子性訪問,不加同步苔悦,多線程并發(fā)訪問會提高性能玖详。注意把介,如果不加此屬性,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問蟋座。鎖被加到所屬對象實例級(我是這么理解的...)拗踢。

二、(一共九題)

1.絡(luò)編程中設(shè)計并發(fā)服務(wù)器向臀,使用多進(jìn)程與多線程巢墅,請問有什么區(qū)別?

a)答1)進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品券膀。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間君纫、堆和棧的復(fù)制品。2)線程:相對與進(jìn)程而言芹彬,線程是一個更加接近與執(zhí)行體的概念蓄髓,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的椚讣啵空間双吆,擁有獨立的執(zhí)行序列眨唬。

線程和進(jìn)程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小会前,但不利于資源管理和保護(hù);而進(jìn)程正相反匾竿。同時瓦宜,線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移岭妖。

2.數(shù)組a[N]临庇,存放了1至N-1個數(shù),其中某個數(shù)重復(fù)一次昵慌。寫一個函數(shù)假夺,找出被重復(fù)的數(shù)字.時間復(fù)雜度必須為o(N)函數(shù)原型:int do_dup(int a[],int N)

答:int do_dup(int a[],intN)

{

int sum= 0;

int sum2;

for(int i=0;i

{

Sum+=a[i];

}

Sum2 = (1+N-1)*N/2;

Return (sum-sum2);

}

3.一語句實現(xiàn)x是否為2的若干次冪的判斷

答:

方法1)int i = 512;

cout <<

boolalpha<< ((i & (i - 1)) ?false : true) << endl;//位與為0,則表示是2的若干次冪

方法2)return (x>>N==1);

4.unsigned int

intvert(unsigned int x,int p,intn)實現(xiàn)對x的進(jìn)行轉(zhuǎn)換,p為起始轉(zhuǎn)化位,n為需要轉(zhuǎn)換的長度,假設(shè)起始點在右邊.如x=0b00010001,p=4,n=3轉(zhuǎn)換后x=0b0110 0001

答:unsigned int intvert(unsigned int x,int p,int n)//假定p=4,n=3

unsigned int _t = 0;unsignedint _a = 1;

for(int i = 0; i

++i)//循環(huán)的目的主要是-t_t |=_a;

_a = _a<<1;

_t =_t<

x ^=_t;

return x;

5.什么是預(yù)編譯,何時需要預(yù)編譯?

答:預(yù)編譯又稱為預(yù)處理,是做些代碼文本的替換工作斋攀。處理#開頭的指令,比如拷貝#include包含的文件代碼已卷,#define宏定義的替換,條件編譯等,就是為編譯做的預(yù)備工作的階段淳蔼,主要處理#開始的預(yù)編譯指令侧蘸,預(yù)編譯指令指示了在程序正式編譯前就由編譯器進(jìn)行的操作裁眯,可以放在程序中的任何位置。c編譯系統(tǒng)在對程序進(jìn)行通常的編譯之前讳癌,先進(jìn)行預(yù)處理穿稳。c提供的預(yù)處理功能主要有以下三種:1)宏定義2)文件包含3)條件編譯。

6.下述三個有什么區(qū)別晌坤?

char * const p;

char const * p

const char *p

char * const p; //常量指針逢艘,p的值不可以修改

char const * p;//指向常量的指針骤菠,指向的常量值不可以改

const char *p埋虹;//和char const *p

7.解釋下列輸出結(jié)果

char str1[] ="abc";char str2[] = "abc";const char str3[] ="abc";

const char str4[] ="abc";const char *str5 = "abc";

const char *str6 ="abc";char *str7 = "abc";char *str8 = "abc";

cout << (str1 == str2 )<< endl;cout << ( str3 == str4 )<< endl;

cout << ( str5 == str6)<< endl;cout << ( str7 == str8 )<< endl;

結(jié)果是:0 0 1 1

解答:str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間娩怎;而str5,str6,str7,str8是指針搔课,它們指向相同的常量區(qū)域。

8.以下代碼中的兩個sizeof用法有問題嗎截亦?[C易]

void UpperCase( char str[] )

//將str中的小寫字母轉(zhuǎn)換成大寫字母

for( size_t i=0;i

if( 'a'<=str[i]&&str[i]<='z'str[i] -= ('a'-'A' );

char str[] ="aBcDe";

cout << "str字符長度為: "<

UpperCase( str );

cout << str<

答:函數(shù)內(nèi)的sizeof有問題爬泥。根據(jù)語法,sizeof如用于數(shù)組崩瓤,只能測出靜態(tài)數(shù)組的大小袍啡,無法檢測動態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個靜態(tài)定義的數(shù)組却桶,因此其大小為6境输,函數(shù)內(nèi)的str實際只是一個指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息颖系,因此sizeof作用于上只將其當(dāng)指針看嗅剖,一個指針為4個字節(jié),因此返回4嘁扼。

注意:數(shù)組名作為函數(shù)參數(shù)時,退化為指針.數(shù)組名作為sizeof()參數(shù)時,數(shù)組名不退化,因為sizeof不是函數(shù).

三信粮、(一共十六題)

1.objective-c中是所有對象間的交互是如何實現(xiàn)的?(深圳皆凱科技有限公司筆試題)

2.如何將產(chǎn)品進(jìn)行多語言發(fā)布?

3.objective-c中是如何實現(xiàn)線程同步的?

4.編寫函數(shù)_memmove說明如下:實現(xiàn)C語言庫函數(shù)memmove的功能:將一塊緩沖區(qū)中的數(shù)據(jù)移動到另一塊緩沖區(qū)中趁啸∏吭担可能有重復(fù)。

5.什么叫數(shù)據(jù)結(jié)構(gòu)不傅?(面試順風(fēng)快遞iPhone開發(fā))

6.編程中旅掂,保存數(shù)據(jù)有哪幾種方式?

7.Sizeof與strlen的區(qū)別和聯(lián)系访娶?

答案:

1.sizeof操作符的結(jié)果類型是size_t商虐,它在頭文件中typedef為unsignedint類型。該類型保證能容納實現(xiàn)所建立的最大對象的字節(jié)大小。

2.sizeof是算符称龙,strlen是函數(shù)留拾。

3.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù)鲫尊,且必須是以''\0''結(jié)尾的痴柔。

4.數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了疫向。

5.大部分編譯程序在編譯的時候就把sizeof計算過了是類型或是變量的長度這就是sizeof(x)可以用來定義數(shù)組維數(shù)的原因

char str[20]="0123456789";//str是編譯期大小已經(jīng)固定的數(shù)組

int a=strlen(str); //a=10;//strlen()在運(yùn)行起確定

int b=sizeof(str); //而b=20;//sizeof()在編譯期確定

6.strlen的結(jié)果要在運(yùn)行的時候才能計算出來咳蔚,是用來計算字符串的實際長度,不是類型占內(nèi)存的大小搔驼。

7.sizeof后如果是類型必須加括弧谈火,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數(shù)舌涨。

char c;

sizeof c;//變量名可以不加括弧

8.當(dāng)適用了于一個結(jié)構(gòu)類型時或變量糯耍,sizeof返回實際的大小,當(dāng)適用一靜態(tài)地空間數(shù)組囊嘉,sizeof歸還全部數(shù)組的尺寸温技。sizeof操作符不能返回動態(tài)地被分派了的數(shù)組或外部的數(shù)組的尺寸

9.數(shù)組作為參數(shù)傳給函數(shù)時傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址扭粱,如:

fun(char [8])

fun(char [])

都等價于fun(char *)

在C++里參數(shù)傳遞數(shù)組永遠(yuǎn)都是傳遞指向數(shù)組首元素的指針舵鳞,編譯器不知道數(shù)組的大小

如果想在函數(shù)內(nèi)知道數(shù)組的大小,需要這樣做:

進(jìn)入函數(shù)后用memcpy拷貝出來琢蛤,長度由另一個形參傳進(jìn)去

fun(unsiged char *p1, int len)

{

unsigned char* buf = new unsigned char[len+1]

memcpy(buf, p1, len);

}

我們能常在用到sizeof和strlen的時候蜓堕,通常是計算字符串?dāng)?shù)組的長度

看了上面的詳細(xì)解釋,發(fā)現(xiàn)兩者的使用還是有區(qū)別的博其,從這個例子可以看得很清楚:

har

str[11]="0123456789";//注意這里str大小因該大于等于11套才,應(yīng)考慮'\0'在內(nèi),否則編譯器會報錯

int a=strlen(str); //a=10;

>>>> strlen計算字符串的長度贺奠,以結(jié)束符0x00為字符串結(jié)束霜旧。

int b=sizeof(str); //而b=11;

>>>> sizeof計算的則是分配的數(shù)組str[11]所占的內(nèi)存空間的大小,不受里面存儲的內(nèi)容改變儡率。

上面是對靜態(tài)數(shù)組處理的結(jié)果,如果是對指針以清,結(jié)果就不一樣了

char* ss ="0123456789";

sizeof(ss)結(jié)果4===》ss是指向字符串常量的字符指針儿普,sizeof獲得的是一個指針的之所占的空間,應(yīng)該是長整型的,所以是4

sizeof(*ss)結(jié)果1===》*ss是第一個字符其實就是獲得了字符串的第一位'0'所占的內(nèi)存空間掷倔,是char類型的眉孩,占了1位strlen(ss)= 10 >>>>如果要獲得這個字符串的長度,則一定要使用strlen另外,下面的方法可以用于確定該靜態(tài)數(shù)組可以容納元素的個數(shù)int a[3]={1,2,3};

cout << sizeof a/sizeof ( typeid( a[0] ).name() );

8.什么是抽象類?抽象類有什么作用浪汪?能實例化嗎巴柿?

9.用Objective-C寫冒泡法.

10.考察對@interface和@property的理解?

11.IPhone開發(fā)中控制類有什么作用死遭?

12.線程中有哪些函數(shù)广恢?寫出來。

13.有沒有寫過自定義的控件呀潭?

14.調(diào)用一個類的靜態(tài)方法需不需要release钉迷?

15.do-while與while-do的區(qū)別?

16.寫出幾個死循環(huán)钠署?

答案:while(1){}

或者do{}while(1)

再或者for(;1;){}

還有g(shù)oto的

Loop:

goto Loop;

四糠聪、(一共十八題)

1.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界赔。或許不是很明顯牵触,在這有例為證:

(void) setName : (NSString*)name {

[name retain];

[myname release];

myname = name;

}

我們來解釋一下:設(shè)想淮悼,用戶在調(diào)用這個函數(shù)的時候,他注意了內(nèi)存的管理揽思,所以他小心的寫了如下代碼:

NSString * newname =[[NSString alloc] initWithString: @"John"];

[aClass setName: newname];

[newname release];

我們來看一看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。

在一個對象的方法里面:

2.self.name =“object”;和name=”object”有什么不同嗎?

答案::self.name = "object"會調(diào)用對象的setName()方法守伸,name = "object"會直接把object賦值給當(dāng)前對象的name屬性。

[backcolor=transparent][backcolor=transparent]

3.這段代碼有什么問題嗎:

[backcolor=transparent]@implementationPerson

[backcolor=transparent]-(void)setAge:(int)newAge {

[backcolor=transparent]self.age= newAge;

[backcolor=transparent]}

[backcolor=transparent]@end

答案:會進(jìn)入死循環(huán)浦妄。

4.什么是retain count?

答案::引用計數(shù)(ref count或者retain count)尼摹。對象的內(nèi)部保存一個數(shù)字,表示被引用的次數(shù)剂娄。例如蠢涝,某個對象被兩個指針?biāo)赶颍ㄒ茫┠敲此膔etain count為2。需要銷毀對象的時候阅懦,不直接調(diào)用dealloc和二,而是調(diào)用release。release會讓retain count減1耳胎,只有retain count等于0惯吕,系統(tǒng)才會調(diào)用dealloc真正銷毀這個對象。

5.以下每行代碼執(zhí)行后怕午,person對象的retain count分別是多少

Person *person = [[Personalloc] init]; count 1

[person retain]; count 2

[person release];count 1

[person release];retaincount = 1;

6.為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的废登?

答案:會引起循環(huán)引用。

7.定義屬性時郁惜,什么情況使用copy堡距,assign,和retain兆蕉。

答案:assign用于簡單數(shù)據(jù)類型羽戒,如NSInteger,double,bool,retain和copy用戶對象,copy用于當(dāng)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){[property release];property = [newValue retain];}

8.Autorelease的對象是在什么時候被release的?

答案:autorelease實際上只是把對release的調(diào)用延遲了四苇,對于每一個Autorelease孝凌,系統(tǒng)只是把該Object放入了當(dāng)前的Autorelease pool中,當(dāng)該pool被釋放時月腋,該pool中的所有Object會被調(diào)用Release蟀架。對于每一個Runloop,系統(tǒng)會隱式創(chuàng)建一個Autorelease pool榆骚,這樣所有的release pool會構(gòu)成一個象CallStack一樣的一個棧式結(jié)構(gòu)片拍,在每一個Runloop結(jié)束時,當(dāng)前棧頂?shù)腁utorelease pool會被銷毀妓肢,這樣這個pool里的每個Object(就是autorelease的對象)會被release捌省。那什么是一個Runloop呢?一個UI事件碉钠,Timer call纲缓,delegate call,都會是一個新的Runloop放钦。那什么是一個Runloop呢色徘?一個UI事件,Timer call操禀,delegate call褂策,都會是一個新的Runloop。

9.這段代碼有什么問題,如何修改

for (int i = 0; i

{

NSString *string = @”Abc”;

string = [stringlowercaseString];

string = [stringstringByAppendingString:@"xyz"];

NSLog(@“%@”, string);

}答案::會內(nèi)存泄露颓屑,

修改:

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

NSAutoreleasePool * pool1 =[[NSAutoreleasePool alloc] init];

NSString *string =@"Abc";

string = [stringlowercaseString];

string = [stringstringByAppendingString:@"xyz"];

NSLog(@"%@",string);

[pool1 drain];

}

你的解決方法效率低斤寂,沒必要在每個循環(huán)都建立autorelease pool。在循環(huán)外面建一個就行了揪惦。

NSAutoreleasePool * pool1 =[[NSAutoreleasePool alloc] init];

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

NSString *string =@"Abc";

string = [stringlowercaseString];

string = [stringstringByAppendingString:@"xyz"];

NSLog(@"%@",string);

}

[pool1 release];//[pool1

drain];效果相同遍搞,但我更喜歡release,看起來傳統(tǒng)一點

10.autorelease和垃圾回收機(jī)制(gc)有什么關(guān)系器腋?答案::不懂

11.IPhone OS有沒有垃圾回收(gc)溪猿?沒有

12.什么是Notification钩杰?答案:觀察者模式,controller向defaultNotificationCenter添加自己的notification诊县,其他類注冊這個notification就可以收到通知讲弄,這些類可以在收到通知時做自己的操作(多觀察者默認(rèn)隨機(jī)順序發(fā)通知給觀察者們,而且每個觀察者都要等當(dāng)前的某個觀察者的操作做完才能輪到他來操作依痊,可以用NotificationQueue的方式安排觀察者的反應(yīng)順序避除,也可以在添加觀察者中設(shè)定反映時間,取消觀察需要在viewDidUnload跟dealloc中都要注銷)胸嘁。參考鏈接:http://useyourloaf.com/blog/2010/6/6/delegation-or-notification.html

13.什么時候用delegate瓶摆,什么時候用Notification?答案:delegate針對one-to-one關(guān)系性宏,并且reciever可以返回值給sender群井,notification可以針對one-to-one/many/none,reciever無法返回值給sender.所以,delegate用于sender希望接受到reciever的某個功能反饋值衔沼,notification用于通知多個object某個事件蝌借。

14.什么是KVC和KVO?答案:KVC(Key-Value-Coding)內(nèi)部的實現(xiàn):一個對象在調(diào)用setValue的時候指蚁,

(1)首先根據(jù)方法名找到運(yùn)行方法的時候所需要的環(huán)境參數(shù)菩佑。

(2)他會從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實現(xiàn)的接口凝化。

(3)再直接查找得來的具體的方法實現(xiàn)稍坯。KVO(Key-Value-Observing):當(dāng)觀察者為一個對象的屬性進(jìn)行了注冊,被觀察對象的isa指針被修改的時候搓劫,isa指針就會指向一個中間類瞧哟,而不是真實的類。所以isa指針其實不需要指向?qū)嵗龑ο笳鎸嵉念惽瓜颉K晕覀兊某绦蜃詈貌灰蕾囉趇sa指針勤揩。在調(diào)用類的方法的時候,最好要明確對象實例的類名秘蛔。

15.Notification和KVO有什么不同陨亡?答:不知道

16.KVO在ObjC中是怎么實現(xiàn)的?答:不知道

17.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控制器默認(rèn)會注冊memory warning notification,當(dāng)view controller的任何view沒有用的時候遮糖,viewDidUnload會被調(diào)用,在這里實現(xiàn)將retain的view release,如果是retain的IBOutlet view屬性則不要在這里release,IBOutlet會負(fù)責(zé)release叠赐。

18.ViewController的didReceiveMemoryWarning是在什么時候被調(diào)用的欲账?默認(rèn)的操作是什么?答案:默認(rèn)調(diào)用[superdidReceiveMemoryWarning]

五屡江、一共七題

1.Objective-C的內(nèi)存管理方式, NSAutoreleasePool的作用

2.寫一個retain方式聲名屬性的setter方法

3.Objective-C與C的區(qū)別有哪些

4.列出你常用的幾個設(shè)計模式,列出如何在Objective-C中實現(xiàn)與應(yīng)用

5.drawRect,

lasyoutSubViews的區(qū)別

6.列舉Cocoa中常用的幾種多線程實現(xiàn)敬惦,并談?wù)劧嗑€程安全問題的幾種解決方案盼理,什么地方會用到多線程

7.Socket連接相關(guān)庫谈山,TCP俄删,UDP的連接方法,HTTP的幾種常用方式

六奏路、一共四題

1.用Objective-C寫冒泡法

2.Cocoa函數(shù)庫的使用

3.考察對線程的理解

4.考察對MVC的理解畴椰?模型—視圖—控制器

七、一共九題

1.Objective-C內(nèi)部的實現(xiàn)

2.CALayer和View的關(guān)系

3.http協(xié)議鸽粉,tcp/ip

4.UITableView的那些元素是可以自定義的斜脂?

5.c語言的,定義變量触机,比如int帚戳,在什么情況下,其最大值是不同的

6.比較32位平臺和64位平臺不同

7.iPhone app為什么會被打回來儡首,如何避免??

8.為啥離開團(tuán)隊片任?

八、一共十題

1.為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain蔬胯?

會導(dǎo)致循環(huán)引用对供。

2.有如下一個類定義

interface MyClass : NSObject

{}

@property(retain) NSString *myProp;

@end

請完成myProp屬性的set方法:

-(void)setMyProp:(NSString*)aProp

{

if(myProp!=aPtrop)

[myProp release]

myProp=[aProp retain ]

}

3.寫出下面程序段的輸出結(jié)果

NSString *aStr = [[[NSString alloc]

initWithString:@”Hello World”] autoRelease];

NSMutableArray *aArray = [NSMutableArray array];

[aArray addObject:aStr];

NSLog(@”ref=%d”, [aStr retainCount])

4.簡述Notification的工作機(jī)制。

5.有一個UIView對象aView氛濒,當(dāng)前大小為全屏产场。請編寫代碼實現(xiàn)如下效果:將aView的寬和高各縮小為原來一半,中心點仍在屏幕中心舞竿,并在縮小的同時實現(xiàn)漸隱京景。

6.寫出下面程序段的輸出結(jié)果

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a stringvalue" forKey:@"akey"];

NSLog(@"%@", [dict objectForKey:@"akey"]);

[dict release];

7.@class關(guān)鍵字有什么作用

8.不使用繼承,為NSStirng類添加新方法myPrint骗奖。

9.寫出下面程序段的輸出結(jié)果

NSArray array = [NSArrayarrayWithObjects:@"one",@"two",@"three",nil];

NSLog(@"%@", [array objectAtIndex:1]);

NSLog(@"%@", [array objectAtIndex:3]);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末确徙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子重归,更是在濱河造成了極大的恐慌米愿,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼻吮,死亡現(xiàn)場離奇詭異育苟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椎木,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門违柏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來博烂,“玉大人,你說我怎么就攤上這事漱竖∏堇椋” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵馍惹,是天一觀的道長躺率。 經(jīng)常有香客問我,道長万矾,這世上最難降的妖魔是什么悼吱? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮良狈,結(jié)果婚禮上后添,老公的妹妹穿的比我還像新娘。我一直安慰自己薪丁,他們只是感情好遇西,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著严嗜,像睡著了一般粱檀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阻问,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天梧税,我揣著相機(jī)與錄音,去河邊找鬼称近。 笑死第队,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刨秆。 我是一名探鬼主播凳谦,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衡未!你這毒婦竟也來了尸执?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤缓醋,失蹤者是張志新(化名)和其女友劉穎如失,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送粱,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡褪贵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脆丁。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡世舰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出槽卫,到底是詐尸還是另有隱情跟压,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布歼培,位于F島的核電站震蒋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丐怯。R本人自食惡果不足惜喷好,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望读跷。 院中可真熱鬧,春花似錦禾唁、人聲如沸效览。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐枉。三九已至,卻和暖如春掘托,著一層夾襖步出監(jiān)牢的瞬間瘦锹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工闪盔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留弯院,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓泪掀,卻偏偏與公主長得像听绳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子异赫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一椅挣、(一共三十題) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex閱讀 947評論 0 0
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,345評論 0 35
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,962評論 0 7
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,712評論 0 4
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理塔拳。運(yùn)行時機(jī)制的原理和運(yùn)用場景鼠证。SDWebImage的原...
    LZM輪回閱讀 2,004評論 0 12