一绞铃、(一共三十題)
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]);