iOS面試題(2)

1.#import和#include的區(qū)別 @class?@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,在m文 件中還是需要使用#import而#import比起#include的好處就是不會引起交叉編譯2. readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用@property是 一個(gè)屬性訪問聲明,擴(kuò)號內(nèi)支持以下幾個(gè)屬性:1,getter=getName,setter=setName,設(shè)置setter與 getter的方法名2,readwrite,readonly,設(shè)置可供訪問級別2,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問題3,retain,setter方法對參數(shù)進(jìn)行release舊值再retain新值,所有 實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料)4,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機(jī)制。5,nonatomic,非原子性訪問,不加同步, 多線程并發(fā)訪問會提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對象實(shí)例級(我是這么理解的…)。3.在一個(gè)對象的方法里面:self.name= “object”;和 name =”object” 有什么不同嗎?答:self.name =”object”:會調(diào)用對象的setName()方法;name = “object”:會直接把object賦值給當(dāng)前對象的name屬性。4.請簡述self.name= nil的機(jī)制,以及與[namerelease]的區(qū)別?self.name =nil;? //使用nil參數(shù)調(diào)用setName:方法[name release]生成的訪問器將自動釋放以前的name對象 5.請簡要說明viewDidLoad和viewDidUnload何時(shí)調(diào)用答:viewDidLoad在view從nib文件初始化時(shí)調(diào)用,loadView在controller的view為nil時(shí)調(diào)用。此方法在編程實(shí)現(xiàn)view時(shí)調(diào)用,view控制器默認(rèn)會注冊memory warning notification,當(dāng)view controller的任何view沒有用的時(shí)候,viewDidUnload會被調(diào)用,在這里實(shí)現(xiàn)將retain的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負(fù)責(zé)release 。6.實(shí)例化一個(gè)UITableView對象,要求寫出關(guān)鍵語句?答:UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];my.delegate = self;my.dataSource = self;首先需要分配空間設(shè)置表格類型然后需要設(shè)置兩個(gè)必須的委托對象。7.使用sql語句查詢出省名以湖開頭,郵編為436001所在的市區(qū)?(5分)(表名及字段名自定義)select*fromcitys where postcode=436001 and province=’湖%’;8.打印結(jié)果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)為加一個(gè)a數(shù)組的偏 移,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)int *ptr=(int *)(&a+1);則ptr實(shí)際 是&(a[5]),也就是a+5原因如下:&a是數(shù)組指針,其類型為 int (*)[5];而 指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int)所以ptr實(shí)際是a[5]但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)所以prt-1只會減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣a是數(shù)組首地址,也就是a[0]的地址,&a是對象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對象的地址,即a[5]. void Func ( char str[100] ) {? sizeof(str ) = ? } void*p = malloc( 100 ); sizeof( p ) = ?這題 很常見了,Func ( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個(gè)指針;在失去其內(nèi)涵的同時(shí),它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺下,指針的長度(占用內(nèi)存的大小)為4字節(jié),故sizeof( str ) 、sizeof( p ) 都為4。 9.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)答:#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在這想看到幾件事情:#define 語法的基本知識(例如:不能以分號結(jié)束,括號的使用,等等)懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價(jià)的。意識到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個(gè)常數(shù)是的長整型數(shù)。如果你在你的表達(dá)式中用到UL(表示無符號長整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。 10.寫一” 標(biāo)準(zhǔn)”宏MIN ,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)答:#define MIN(A,B) ((A) <= (B) ? (A) : (B))這個(gè)測試是為下面的目的而設(shè)的:標(biāo)識#define在宏中應(yīng)用的基本知識。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。三重條件操作符的知識。這個(gè)操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比 if-then-else 更優(yōu)化的代碼,了解這個(gè)用法是很重要的。 懂得在宏中小心地把參數(shù)用括號括起來? 我也用這個(gè)問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會發(fā)生什么事?? least = MIN(*p++, b);結(jié)果是:((*p++) <= (b) ? (*p++) :(*p++))這個(gè)表達(dá)式會產(chǎn)生副作用,指針p會作三次++自增操作。 11.數(shù)組和指針的區(qū)別(1)數(shù)組可以申請?jiān)跅^(qū)和數(shù)據(jù)區(qū);指針可以指向任意類型的內(nèi)存塊(2)sizeof作用于數(shù)組時(shí),得到的是數(shù)組所占的內(nèi)存大??;作用于指針時(shí),得到的都是4個(gè)字節(jié)的大小(3)數(shù)組名表示數(shù)組首地址,值不可以改變,如不可以將++作用于數(shù)組名上;普通指針的值可以改變,如可將++作用于指針上(4)用字符串初始化字符數(shù)組是將字符串的內(nèi)容拷貝到字符數(shù)組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數(shù)組 12.static的作用(1)函數(shù)體內(nèi)static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時(shí)仍維持上次的值;(2)在模塊內(nèi)的static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;(3)在模塊內(nèi)的static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊內(nèi);(4)在類中的static 成員變量屬于整個(gè)類所擁有,對類的所有對象只有一份拷貝;(5)在類中的static 成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。 13.簡述內(nèi)存分區(qū)情況(1)代碼區(qū):存放函數(shù)二進(jìn)制代碼(2)數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時(shí)申請內(nèi)存并初始化,系統(tǒng)退出時(shí)由系統(tǒng)釋放。存放全局變量、靜態(tài)變量、常量(3)堆區(qū):通過malloc等函數(shù)或new等操作符動態(tài)申請得到,需程序員手動申請和釋放(4)棧區(qū):函數(shù)模塊內(nèi)申請,函數(shù)結(jié)束時(shí)由系統(tǒng)自動釋放。存放局部變量、函數(shù)參數(shù) 14.#include和#include”filename”有什么區(qū)別答:#include直接在庫文件目錄中搜索所包含的文件;#include”filename”在當(dāng)前目錄下搜索所包含的文件,如果沒有的話再到庫文件目錄搜索。15.const char *p;? charconst*p;? char*const p;? const char* const p;四個(gè)修飾指針有什么區(qū)別答: (1)定義了一個(gè)指向不可變的字符串的字符指針(2)和(1)一樣(3)定義了一個(gè)指向字符串的指針,該指針值不可改變,即不可改變指向(4)定義了一個(gè)指向不可變的字符串的字符指針,且該指針也不可改變指向16.MVC的理解?答:MVC模式考慮三種對象:模型對象、視圖對象和控制器對象。 模型對象負(fù)責(zé)應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯; 視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù); 控制器對象是M與V之間的協(xié)調(diào)者。 17.在Obj-c中有沒有私有方法?私有變量?一般采用什么方法實(shí)現(xiàn)?objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對象只暴露有用的東西. 如果沒有了私有方法的話, 對于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(gè)私有方法@interfaceController : NSObject { NSString *something; }+(void)thisIsAStaticMethod;-(void)thisIsAnInstanceMethod;@end@interfaceController (private)-(void)thisIsAPrivateMethod;@end@private可以用來修飾私有變量在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的18.OC中加號方法與減號的區(qū)別?加號方法是類方法,屬于靜態(tài)方法減號方法是實(shí)例方法必須由類的實(shí)例來調(diào)用 19.free與release的區(qū)別 20.在終端環(huán)境下,分別說明4,2,1,0對應(yīng)的權(quán)限是什么21.ARC機(jī)制ARC就是automatic reference counting ,簡單說就是就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內(nèi)存管理的引用計(jì)數(shù)的代碼可以自動地由編譯器完成了。使用ARC的好處使用ARC有什么好處呢?看到上面的例子,大家就知道了,以后寫Objective-C的代碼變得簡單多了,因?yàn)槲覀儾恍枰獡?dān)心煩人的內(nèi)存管理,擔(dān)心內(nèi)存泄露了代碼的總量變少了,看上去清爽了不少,也節(jié)省了勞動力代碼高速化,由于使用編譯器管理引用計(jì)數(shù),減少了低效代碼的可能性不好的地方記住一堆新的ARC規(guī)則—關(guān)鍵字及特性等需要一定的學(xué)習(xí)周期一些舊的代碼,第三方代碼使用的時(shí)候比較麻煩;修改代碼需要工數(shù),要么修改編譯開關(guān) 22.自動釋放池是什么,如何工作當(dāng)您向一個(gè)對象發(fā)送一個(gè)autorelease 消息時(shí),Cocoa就會將該對象的一個(gè)引用放入到最新的自動釋放池。它仍然是個(gè)正當(dāng)?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動釋放池就會被釋放,池中的所有對象也就被釋放。1. ojc-c 是 通過一種”referring counting”(引用計(jì)數(shù))的方式來管理內(nèi)存的, 對象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會減一,如果此對象的計(jì)數(shù)變?yōu)榱?, 就會被系統(tǒng)銷毀.2. NSAutoreleasePool 就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.3. autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會在對象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.23.ViewController 的 loadView, viewDidLoad,viewDidUnload 分別是在什么時(shí)候調(diào)用的?在自定義ViewController的時(shí)候這幾個(gè)函數(shù)里面應(yīng)該做什么工作?viewDidLoad在view 從nib文件初始化時(shí)調(diào)用,loadView在controller的view為nil時(shí)調(diào)用。此方法在編程實(shí)現(xiàn)view時(shí)調(diào)用,view 控制器默認(rèn)會注冊memory warning notification,當(dāng)view controller的任何view 沒有用的時(shí)候,viewDidUnload會被調(diào)用,在這里實(shí)現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負(fù)責(zé)release 。24. 淺復(fù)制和深復(fù)制的區(qū)別?//淺拷貝和深拷貝答案:淺層復(fù)制(copy):只復(fù)制指向?qū)ο蟮闹羔?,而不?fù)制引用對象本身。//通過對象的指針來訪問這個(gè)對象深層復(fù)制(mutableCopy):復(fù)制引用對象本身 意思就是有個(gè)A對象,復(fù)制一份后得到A_copy對象后,對于淺復(fù)制來說,A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不過是是一個(gè)指針,對象本身資源 還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了 兩份獨(dú)立對象本身。//當(dāng)修改A時(shí),A copy不變。25. frame和bounds有什么不同?答案:frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))//frame:框架、結(jié)構(gòu)bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))//bounds:界限 26. obj-c的優(yōu)缺點(diǎn)答案:objc優(yōu)點(diǎn):1) Cateogies2) Posing3) 動態(tài)識別4) 指標(biāo)計(jì)算5)彈性訊息傳遞6) 不是一個(gè)過度復(fù)雜的 C 衍生語言7) Objective-C 與 C++ 可混合編程缺點(diǎn):1) 不支援命名空間2)? 不支持運(yùn)算符重載3) 不支持多重繼承4) 使用動態(tài)運(yùn)行時(shí)類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。27.? 用變量a給出下面的定義? a) 一個(gè)整型數(shù)(An integer)? b)一個(gè)指向整型數(shù)的指針( A pointer to aninteger)? c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)( Apointer to a pointer to an intege)r? d)一個(gè)有10個(gè)整型數(shù)的數(shù)組( An array of 10 integers)? e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的。(An array of 10 pointers to integers)? f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers)? g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(Apointer to a function that takes an integer as an argument? andreturns an integer)? h)一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions t hat takean integer argument and return an integer )? 答案是:a) int a; // Anintegerb) int *a; // A pointer to anintegerc) int **a; // A pointer to apointer to an integerd) int a[10]; // An array of10 integerse) int *a[10]; // An array of10 pointers to integersf) int (*a)[10]; // A pointerto an array of 10 integersg) int (*a)(int); // A pointerto a function a that? takes an integer argument and returns anintegerh) int (*a[10])(int); // Anarray of 10 pointers to functions? that take an integer argument andreturn an integer28. 寫出幾個(gè)死循環(huán)?29. 隊(duì)列和棧有什么區(qū)別:答:隊(duì)列和棧是兩種不同的數(shù)據(jù)容器。從”數(shù)據(jù)結(jié)構(gòu)”的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),它在兩端進(jìn)行操作,一端進(jìn)行入隊(duì)列操作,一端進(jìn)行出列隊(duì)操作。棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),它只能在棧頂進(jìn)行操作,入棧和出棧都在棧頂操作。30.HTTP協(xié)議中,POST和GET的區(qū)別是什么?答案:1.GET 方法GET 方法提交數(shù)據(jù)不安全,數(shù)據(jù)置于請求行,客戶端地址欄可見;GET 方法提交的數(shù)據(jù)大小有限GET 方法不可以設(shè)置書簽2.POST 方法POST 方法提交數(shù)據(jù)安全,數(shù)據(jù)置于消息主體內(nèi),客戶端不可見POST 方法提交的數(shù)據(jù)大小沒有限制POST 方法可以設(shè)置書簽31.? iOS的系統(tǒng)架構(gòu)分為( 核心操作系統(tǒng)層 theCore OS layer )、( 核心服務(wù)層theCore Services layer )、( 媒體層 theMedia layer )和( Cocoa 界面服務(wù)層 the Cocoa Touch layer )四個(gè)層次。32.? 控件主要響應(yīng)3種事件:( 基于觸摸的事件 )、( 基于值的事件 )和( 基于編輯的事件 )。33.? xib文件的構(gòu)成分為哪3個(gè)圖標(biāo)?都具有什么功能。(10分)答: File’s Owner 是所有 nib 文件中的每個(gè)圖標(biāo),它表示從磁盤加載 nib 文件的對象;First Responder 就是用戶當(dāng)前正在與之交互的對象;View 顯示用戶界面;完成用戶交互;是 UIView 類或其子類。34.? 簡述視圖控件器的生命周期(10分)。答: loadView 盡管不直接調(diào)用該方法,如多手動創(chuàng)建自己的視圖,那么應(yīng)該覆蓋這個(gè)方法并將它們賦值給試圖控制器的 view 屬性。viewDidLoad 只有在視圖控制器將其視圖載入到內(nèi)存之后才調(diào)用該方法,這是執(zhí)行任何其他初始化操作的入口。viewDidUnload 當(dāng)試圖控制器從內(nèi)存釋放自己的方法的時(shí)候調(diào)用,用于清楚那些可能已經(jīng)在試圖控制器中創(chuàng)建的對象。viewVillAppear 當(dāng)試圖將要添加到窗口中并且還不可見的時(shí)候或者上層視圖移出圖層后本視圖變成頂級視圖時(shí)調(diào)用該方法,用于執(zhí)行諸如改變視圖方向等的操作。實(shí)現(xiàn)該方法時(shí)確保調(diào)用 [super viewWillAppear:].viewDidAppear 當(dāng)視圖添加到窗口中以后或者上層視圖移出圖層后本視圖變成頂級視圖時(shí)調(diào)用,用于放置那些需要在視圖顯示后執(zhí)行的代碼。確保調(diào)用 [super viewDidAppear: ] 。35.? 動畫有基本類型有哪幾種;表視圖有哪幾種基本樣式(10分)?答:動畫有兩種基本類型:隱式動畫和顯式動畫。36.? 實(shí)現(xiàn)簡單的表格顯示需要設(shè)置UITableView的什么屬性、實(shí)現(xiàn)什么協(xié)議(10分)?答:實(shí)現(xiàn)簡單的表格顯示需要設(shè)置 UITableView 的 dataSource 和 delegate 屬性,實(shí)現(xiàn)UITableViewDataSource 和 UITableViewDelegate 協(xié)議。37.? Cocoa Touch提供了哪幾種Core Animation過渡類型(10分)?答: Cocoa Touch 提供了 4 種 Core Animation 過渡類型,分別為:交叉淡化、推擠、顯示和覆蓋。38.? UIView與CLayer有什么區(qū)別(10分)?答: 1. UIView 是 iOS 系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它。它本身完全是由 CoreAnimation 來實(shí)現(xiàn)的。它真正的繪圖部分,是由一個(gè) CALayer 類來管理。 UIView 本身更像是一個(gè) CALayer 的管理器,訪問它的跟繪圖和跟坐標(biāo)有關(guān)的屬性。2. UIView 有個(gè)重要屬性 layer ,可以返回它的主 CALayer 實(shí)例。3. UIView 的 CALayer 類似 UIView 的子 View 樹形結(jié)構(gòu),也可以向它的 layer 上添加子layer ,來完成某些特殊的表示。即 CALayer 層是可以嵌套的。4. UIView 的 layer 樹形在系統(tǒng)內(nèi)部,被維護(hù)著三份 copy 。分別是邏輯樹,這里是代碼可以操縱的;動畫樹,是一個(gè)中間層,系統(tǒng)就在這一層上更改屬性,進(jìn)行各種渲染操作;顯示樹,其內(nèi)容就是當(dāng)前正被顯示在屏幕上得內(nèi)容。5. 動畫的運(yùn)作:對 UIView 的 subLayer (非主 Layer )屬性進(jìn)行更改,系統(tǒng)將自動進(jìn)行動畫生成,動畫持續(xù)時(shí)間的缺省值似乎是 0.5 秒。6. 坐標(biāo)系統(tǒng): CALayer 的坐標(biāo)系統(tǒng)比 UIView 多了一個(gè) anchorPoint 屬性,使用CGPoint 結(jié)構(gòu)表示,值域是 0~1 ,是個(gè)比例值。這個(gè)點(diǎn)是各種圖形變換的坐標(biāo)原點(diǎn),同時(shí)會更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。7. 渲染:當(dāng)更新層,改變不能立即顯示在屏幕上。當(dāng)所有的層都準(zhǔn)備好時(shí),可以調(diào)用setNeedsDisplay 方法來重繪顯示。8. 變換:要在一個(gè)層中添加一個(gè) 3D 或仿射變換,可以分別設(shè)置層的 transform 或affineTransform 屬性。9. 變形: Quartz Core 的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個(gè)三維坐標(biāo)系中以任意角度被旋轉(zhuǎn),縮放和傾斜。 CATransform3D 的一套方法提供了一些魔術(shù)般的變換效果。39.鏈表翻轉(zhuǎn)。? ? ? 40.? 鏈表逆序(C語言)(10分)。鏈表逆序就是把一個(gè)鏈表按照原來的鏈接順序逆序?qū)崿F(xiàn)(也就是將頭變成尾,尾變成頭)。編程思路:其實(shí)最關(guān)鍵的是先通過原來的鏈接順序找到下個(gè)節(jié)點(diǎn),然后再把前個(gè)節(jié)點(diǎn)反序。41. Quatrz 2D的繪圖功能的三個(gè)核心概念是什么并簡述其作用(10分)。答:上下文:主要用于描述圖形寫入哪里;路徑:是在圖層上繪制的內(nèi)容;狀態(tài):用于保存配置變換的值、填充和輪廓, alpha 值等。42.? iPhone OS主要提供了幾種播放音頻的方法(10分)?答: SystemSound ServicesAVAudioPlayer 類Audio Queue ServicesOpenAL43.? 使用AVAudioPlayer類調(diào)用哪個(gè)框架、使用步驟(10分)?答: AVFoundation.framework步驟:配置 AVAudioPlayer 對象;實(shí)現(xiàn) AVAudioPlayer 類的委托方法;控制 AVAudioPlayer 類的對象;監(jiān)控音量水平;回放進(jìn)度和拖拽播放。44.? 有哪幾種手勢通知方法、寫清楚方法名(10分)?答:-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;45.? 實(shí)例化一個(gè)UITableView對象,要求寫出關(guān)鍵語句(10分)。答: UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];my.delegate = self;my.dataSource = self;首先需要分配空間設(shè)置表格類型然后需要設(shè)置兩個(gè)必須的委托對象。46.? CFSocket使用有哪幾個(gè)步驟(10分)。答:創(chuàng)建 Socket 的上下文;創(chuàng)建 Socket ;配置要訪問的服務(wù)器信息;封裝服務(wù)器信息;連接服務(wù)器;47.? Core Foundation中提供了哪幾種操作Socket的方法(10分)?答: CFNetwork 、 CFSocket 和 BSD Socket 。48.? 解析XML文件有哪幾種方式(10分)?答:以 DOM 方式解析 XML 文件;以 SAX 方式解析 XML 文件;49.? 自定義一個(gè)委托(15分)。答: @protocol SimpleProtocol-(void)doSomething:(NSString*)str;@end@interfaceSimpleClass:NSObject< SimpleProtocol >{}@end@implementationSimpleClass-(void)doSomething:(NSString *)str{NSLog(str);}@end50.? 類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?答案: category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(yōu)先級。 類別主要有 3 個(gè)作用: (1) 將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。 (2) 創(chuàng)建對私有方法的前向引用。 (3) 向?qū)ο筇砑臃钦絽f(xié)議。 繼承可以增加,修改方法,并且可以增加屬性。51.通知和協(xié)議的不同之處?答案:協(xié)議有控制鏈 (has-a) 的關(guān)系,通知沒有。 首先我一開始也不太明白,什么叫控制鏈(專業(yè)術(shù)語了 ~ )。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解 簡單來說,通知的話,它可以一對多,一條消息可以發(fā)送給多個(gè)消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經(jīng)濟(jì)代理人,很多時(shí)候一個(gè)經(jīng)濟(jì)人負(fù)責(zé)好幾個(gè)明星的事務(wù)。 只是對于不同明星間,代理的事物對象都是不一樣的,一一對應(yīng),不可能說明天要處理 A 明星要一個(gè)發(fā)布會,代理人發(fā)出處理發(fā)布會的消息后,別稱 B 的 發(fā)布會了。但是通知就不一樣,他只關(guān)心發(fā)出通知,而不關(guān)心多少接收到感興趣要處理。 因此控制鏈( has-a 從英語單詞大致可以看出,單一擁有和可控制的對應(yīng)關(guān)系。52.關(guān)于多態(tài)性答案:多態(tài),子類指針可以賦值給父類。 這個(gè)題目其實(shí)可以出到一切面向?qū)ο笳Z言中, 因此關(guān)于多態(tài),繼承和封裝基本最好都有個(gè)自我意識的理解,也并非一定要把書上資料上寫的能背出來。 最重要的是轉(zhuǎn)化成自我理解。53.對于單例的理解答案:基本能用熟悉的語言寫出一個(gè)單例,以及可以運(yùn)用到的場景或是你編程中碰到過運(yùn)用的此種模式的框架類等。 進(jìn)一步點(diǎn),考慮下如何在多線程訪問單例時(shí)的安全性。54.? 是否在一個(gè)視圖控制器中嵌入兩個(gè)tableview控制器?答案:一個(gè)視圖控制只提供了一個(gè) View 視圖,理論上一個(gè) tableViewController 也不能放吧, 只能說可以嵌入一個(gè) tableview 視圖。當(dāng)然,題目本身也有歧義,如果不是我們定性思維認(rèn)為的 UIViewController , 而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個(gè)視圖控制者,它可以控制多個(gè)視圖控制器,比如 TabbarController 那樣的感覺。55. 一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會怎么處理?答案:首先我們從代碼來看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實(shí)是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實(shí)現(xiàn)的。 因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源。 因此,我覺得可以設(shè)置多個(gè)數(shù)據(jù)源啊,但是有個(gè)問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?56. Object -c 的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?重寫一個(gè)類的方式用繼承好還是分類 好?為什么?答案: Objective-c 只支持單繼承,如果要實(shí)現(xiàn)多繼承的話,可以通過類別和協(xié)議的方式來實(shí)現(xiàn), cocoa 中所有的類都是 NSObject 的子類,多繼承在這里是用 protocol 委托代理來實(shí)現(xiàn)的。57. id 聲明的對象有什么特性?答案: id 是個(gè)很重要的類型,是個(gè)可以指向任何類型的指針或者可以理解為指向任何未知類型的指針。58. 自動釋放池跟GC (垃圾回收)有什么區(qū)別?iPhone上有GC么?[poolrelease] 和[pooldrain]有什么區(qū)別?iPhone 上沒有 GC 。 iPhone 開發(fā)的時(shí)候沒有垃圾回收機(jī)制。 在垃圾回收環(huán)境中,release 是一個(gè)空操作。因此, NSAutoreleasePool 提供了 drain 方法,在引用計(jì)數(shù)環(huán)境中,該方法的作用等同于調(diào)用 release ,但在垃圾回收環(huán)境中,它會觸發(fā)垃圾回收(如果自上次垃圾回收以來分配的內(nèi)存大于當(dāng)前的閾值)。因此,在通常情況下,您應(yīng)該使用 drain 而不是 release 來銷毀自動釋放池。59.? 線程與進(jìn)程的區(qū)別和聯(lián)系?答案 : 進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。 程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。 60. ios 平臺怎么做數(shù)據(jù)的持久化?coredata 和sqlite有無必然聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)庫嗎?iOS 中可以有四種持久化數(shù)據(jù)的方式:屬性列表、對象歸檔、 SQLite3 和 Core Data; core data 可以使你以圖形界面的方式快速的定義 app 的數(shù)據(jù)模型,同時(shí)在你的代碼中容易獲取到它。 coredata 提供了基礎(chǔ)結(jié)構(gòu)去處理常用的功能,例如保存,恢復(fù),撤銷和重做,允許你在 app 中繼續(xù)創(chuàng)建新的任務(wù)。在使用 core data 的時(shí)候,你不用安裝額外的數(shù)據(jù)庫系統(tǒng),因?yàn)?core data 使用內(nèi)置的 sqlite 數(shù)據(jù)庫。 core data 將你 app 的模型層放入到一組定義在內(nèi)存中的數(shù)據(jù)對象。 coredata 會追蹤這些對象的改變,同時(shí)可以根據(jù)需要做相反的改變,例如用戶執(zhí)行撤銷命令。當(dāng) core data 在對你 app 數(shù)據(jù)的改變進(jìn)行保存的時(shí)候, core data 會把這些數(shù)據(jù)歸檔,并永久性保存。 mac os x 中sqlite 庫,它是一個(gè)輕量級功能強(qiáng)大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序??梢栽诙鄠€(gè)平臺使用, sqlite 是一個(gè)輕量級的嵌入式 sql 數(shù)據(jù)庫編程。與 core data 框架不同的是, sqlite 是使用程序式的, sql 的主要的 API 來直接操作數(shù)據(jù)表。 Core Data 不是一個(gè)關(guān)系型數(shù)據(jù)庫,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng) (RDBMS) 。雖然 Core Dta 支持SQLite 作為一種存儲類型,但它不能使用任意的 SQLite 數(shù)據(jù)庫。 Core Data 在使用的過程種自己創(chuàng)建這個(gè)數(shù)據(jù)庫。 Core Data 支持對一、對多的關(guān)系。61. obj-c 有多重繼承么? 如果沒有什么替代方法?cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理來實(shí)現(xiàn)的。你不用去考慮繁瑣的多繼承,虛基類的概念。62. obj-c 有私有方法么? 私有變量呢?objective-c - 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對象只暴露有用的東西. 如果沒有了私有方法的話, 對于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(gè)私有方法@interface Controller : NSObject { NSString *something; }+ (void)thisIsAStaticMethod;- (void)thisIsAnInstanceMethod;@end@interface Controller (private) -(void)thisIsAPrivateMethod;@end @private 可以用來修飾私有變量在Objective‐C 中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的63. 假定輸入的字符串中只包含字母和* 號。編寫函數(shù)fun,功能是,除了中間和尾部的*號外,將字符串中其他* 號全部刪除。編寫時(shí),不用c的其他函數(shù)。例:*****A*BC*DEF*G****? ? 結(jié)果為:A*BC*DEF*G****void fun (char *a) {int j=0;char *p=a;while (*p==’*')p++;while (*p){a[j++]=*p;p++; }a[j]=0; }64. 截取字符串”20 |http://www.621life.com“ 中 ‘|’字符前面及后面的數(shù)據(jù),分別輸出它們(10分)。NSString *str = “20|http://www.621life.com”;NSRange range = [strrangeOfString:@"|"];int location = range.location;NSString *str1 = [strsubstringToIndex:location];NSString *str2 = [str substringFromIndex:location+1];65. 獲取項(xiàng)目根路徑,并在其下創(chuàng)建一個(gè)名稱為userData 的目錄。(10分)。// 獲取根路徑NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString *documentsDirectory = [paths objectAtIndex:];// 創(chuàng)建文件系統(tǒng)管理器NSFileManager *fileManager = [[NSFileManageralloc] init];// 判斷userData 目錄是否存在if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {// 不存在, 創(chuàng)建一個(gè)userData目錄[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];}66. tableView 的重用機(jī)制(10 分)?UITableView 通過重用單元格來達(dá)到節(jié)省內(nèi)存的目的: 通過為每個(gè)單元格指定一個(gè)重用標(biāo)識符(reuseIdentifier),即指定了單元格的種類,以及當(dāng)單元格滾出屏幕時(shí),允許恢復(fù)單元格以便重用.對于不同種類的單元格使用不同的ID,對于簡單的表格,一個(gè)標(biāo)識符就夠了.67. 這段代碼有什么問題嗎@implementation Person? i.? ? ? (void)setAge:(int)newAge{? self.age = newAge;? }死循環(huán)68. 用變量a 給出下面的定義a)? ? 一個(gè)整型b)? ? 一個(gè)指向整型數(shù)的指針c)? ? 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)d)? ? 一個(gè)有10 個(gè)整型數(shù)的數(shù)組e)? ? 一個(gè)有10 個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的f)? ? 一個(gè)指向有10 個(gè)整型數(shù)數(shù)組的指針g)? ? 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)h)? ? 一個(gè)有10 個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù) a)? ? int a;b)? ? int *a;c)? ? int **a;d)? ? int a[10]e)? ? int *a[10];f)? ? int (*a)[10];g)? ? int (*a)(int);i)? ? int (*a[10])(int); 69. 給定一個(gè)字符串,輸出本字符串中只出現(xiàn)一次并且最靠前的那個(gè)字符的位置?比如”abaccddeeef” 則是b,輸出2 int find(char *_str){char *p = _str;inti = 1;while (*p){char *temp = _str;while (*temp){if ((*p ==*temp)&&(p != temp)){break;}temp++;if (*temp == 0) {returni;}}i++;p++;}return-1;}#include#include#includeintfind_char(constchar* str){staticintpos[256];const unsigned char* p =(const unsigned char*)str;inti = 0;if( (!str) || (!(*str)) )return -1;memset(pos,-1,sizeof(pos));while(*p){if(pos[*p] == -1){pos[*p] = p-(const unsigned char*)str;}else{pos[*p] = -2;}p++;}for(i=0;i=0)returnpos[i];}return -1;}int main(){constchar* p =”abaccddeeef”;intpos = find_char(p);printf(“%d, it is’%c’\n”,pos,pos!=-1?p[pos]:’ ‘);p =”abcdefghijklmnopqrstuvwxyz ““abcdefghijklmnopqrstuwxyz”;pos = find_char(p);printf(“%d, it is’%c’\n”,pos,pos!=-1?p[pos]:’ ‘);return0;}70. objective-c 中的數(shù)字對象都有哪些,簡述它們與基本數(shù)據(jù)類型的區(qū)別是什么?在OC 中NSNumber是數(shù)字對象,可以進(jìn)行拆裝箱操作!// 將int 轉(zhuǎn)為NSNumberNSNumber *num = [NSNumber numberWithInt:123];// 得到一個(gè)intinttestNum = [numintValue];71. 用NSLog 函數(shù)輸出一個(gè)浮點(diǎn)類型,結(jié)果四舍五入,并保留一位小數(shù)NSLog(@”%0.1f”,4.4324);72. objective-c 中的詞典對象、可變詞典對象是哪個(gè),初始化一個(gè)含有兩個(gè)鍵值對的可變詞典對象,并動態(tài)的添加和刪除一條記錄,輸出第一條記錄.詞典NSDictionary ,可變詞典NSMutableDictionary,// 初始化一個(gè)可變詞典,帶有2 個(gè)鍵值對NSMutableDictionary *dic =[NSMutableDictionarydictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];// 添加[dicsetObject:@"value3"forKey:@"key3"];// 刪除[dicremoveObjectForKey:@"key3"];// 獲取(按key 獲?。dicobjectForKey:@"key1"];73. 獲取項(xiàng)目根路徑,并在其下創(chuàng)建一個(gè)名稱為userData 的目錄。// 獲取根路徑NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*documentsDirectory = [paths objectAtIndex:];// 創(chuàng)建文件系統(tǒng)管理器NSFileManager *fileManager= [[NSFileManageralloc] init];// 判斷userData 目錄是否存在if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {// 不存在, 創(chuàng)建一個(gè)userData目錄[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];}74. do-while 與 while-do 的區(qū)別?do-while 先執(zhí)行循環(huán)體,然后判斷條件,如果條件判斷為ture ,則繼續(xù)執(zhí)行循環(huán)體,如果判斷為false,則不執(zhí)行循環(huán)體while-do 是先判斷條件是否正確,若正確則執(zhí)行循環(huán)體,若不正確則不執(zhí)行循環(huán)體。所以do-while 至少循環(huán)一次,而while-do有可能一次也不循環(huán)。75. 用C 語言,求2到100內(nèi)的所有素?cái)?shù)和。 #includeintisPrime(int n)? ? ? ? ? ? // 求素?cái)?shù),這是最經(jīng)典的算法代碼。建議記住

{

inti;

for(i=2;i*i<=n;i++)

if(n%i==0)

return 0;

return 1;

}

int main()

{

inti,sum=0;

for(i=2;i<100;i++)

if( isPrime(i))

sum+=i;

printf(“%5d”,sum);

return 0 ;

}

intisPrime(int n)

{

inti;

for(i=2;i<=n/2;i++)

{

if(n%i==0)

break;

}

if(i>n/2)

return1;

else

return0;

}

76.單件實(shí)例是什么(10分)。

Foundation?和 Application Kit?框架中的一些?類?只允?許創(chuàng)?建?單?件?對?象,即?這?些?類?在當(dāng)前?進(jìn)?程中的唯一?實(shí)?例。?舉?例來?說?,NSFileManager?和NSWorkspace?類?在使用時(shí)?都是基于?進(jìn)?程?進(jìn)?行?單?件?對?象的?實(shí)?例化。當(dāng)向?這?些?類請?求?實(shí)?例的?時(shí)?候,它?們會向您?傳遞單?一?實(shí)?例的一個(gè)引用,如果?該實(shí)?例?還?不存在,?則?首先?進(jìn)?行?實(shí)?例的分配 和初始化。?單?件?對?象充當(dāng)控制中心的角色,?負(fù)責(zé)?指引或?協(xié)調(diào)類?的各種服?務(wù)?。如果?類?在概念上只有一個(gè)?實(shí)?例(比如

NSWorkspace?),就?應(yīng)該產(chǎn)?生 一個(gè)?單?件?實(shí)?例,而不是多個(gè)?實(shí)?例;如果將來某一天可能有多個(gè)?實(shí)?例,您可以使用?單?件?實(shí)?例機(jī)制,而不是工廠方法或函數(shù)。

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

當(dāng)您向一個(gè)對象發(fā)送一個(gè)autorelease?消息時(shí),Cocoa就會將該對象的一個(gè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,619評論 3 44
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,656評論 30 472
  • #import和#include的區(qū)別 @class? @class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)...
    sellse閱讀 372評論 0 2
  • 1.#import和#include的區(qū)別 @class? @class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量...
    晚照清舟閱讀 516評論 0 0
  • 昨天學(xué)到的是好詞,今天卻是不吉利的Ominous,乍一看有點(diǎn)像Omnipotent(萬能的),因?yàn)镺mni作為詞綴...
    FeBird閱讀 1,273評論 0 0

友情鏈接更多精彩內(nèi)容