1. 下面關(guān)于#import和#include的描述正確的是()
A. #import 是 #include 的替代指令瘪菌,防止重復(fù)引用
B. #import 和 #include 不可以混合使用
C. #import 只用于引用 Objective-C的文件狼速, #include 只用于引用C和C++的文件
D. #import 和 #include 的使用效果完全相同
Key: A
解析:#include和#import都可以用在ObjC程序中導(dǎo)入頭文件斤贰,但是#include是C中的初烘。
在C中罢绽,當(dāng)多個(gè)文件都導(dǎo)入了同一個(gè)頭文件時(shí)师逸,需要按如下方式進(jìn)行定義:
#ifndef HelloObjective_C_Header_h
#define HelloObjective_C_Header_h
#endif
這樣才能避免一個(gè)文件中重復(fù)導(dǎo)入一個(gè)頭文件津滞,造成程序效率低下寓调。
#import
是Objective-C才有的锌唾,跟#include
導(dǎo)入頭文件的差別在于通過(guò)#import導(dǎo)入頭文件時(shí)會(huì)自動(dòng)判斷頭文件是否已經(jīng)被導(dǎo)入過(guò),不必要像C中一樣還要進(jìn)行宏判斷來(lái)確認(rèn)是否已經(jīng)被導(dǎo)入過(guò)夺英!
2. 下面那個(gè)方法可以比較兩個(gè)NSString *str1, *str2 的異同()
A. if(str1 = str2) xxx ;
B. if([str1 isEqualToString:str2]) xxx ;
C. if(str1 && str2) xxx ;
D. if([str1 length] == [str2 length]) xxx;
key: B
解析:== :比較的是指針指向的地址晌涕,OC中的對(duì)象都是用指針表示的
?? isEqual:返回一個(gè)bool值判斷兩個(gè)對(duì)象是否相等
?? isEqualToString:返回一個(gè)bool值判斷給出的字符串是否與已有的Unicode字符相同
3.Objective-C有私有方法嗎?有私有變量嗎痛悯?()
A. 有私有方法和私有變量
B. 沒(méi)有私有方法, 也沒(méi)有私有變量
C. 沒(méi)有私有方法余黎,有私有變量
D. 有私有方法,沒(méi)有私有變量
Key: B
解析:私有變量的定義類(lèi)似私有方法载萌,但是在 Objective-C 中惧财,仍然可以通過(guò) runtime 來(lái)實(shí)現(xiàn)對(duì)私有變量的訪問(wèn)。
4. 下面關(guān)于線(xiàn)程管理錯(cuò)誤的是()
A. GCD所用的開(kāi)銷(xiāo)要比NSThread大
B. 可以在子線(xiàn)程中修改UI元素
C. NSOperationQueue是比NSthread更高層的封裝
D. GCD可以根據(jù)不同優(yōu)先級(jí)分配線(xiàn)程
Key: B
5. 下面代碼的作用是讓doSomeThing函數(shù)每隔1秒被調(diào)用1次扭仁。請(qǐng)問(wèn)哪里有問(wèn)題()
NSTimer *myTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(doSomeThing:) userInfo:nil repeats:YES];
[myTimer fire]
A. 沒(méi)有將timer加入runloop
B. doSomeThing缺少參數(shù)
C. 忘記傳遞數(shù)據(jù)給userInfo
D. myTimer對(duì)象未通過(guò)[[myTimer alloc] init]方法初始化
Key: A
解析:NSTimer有兩個(gè)常用的方法:
//創(chuàng)建一個(gè)計(jì)時(shí)器可缚,參數(shù)1:時(shí)間間隔(秒),參數(shù)2:表示發(fā)送的對(duì)象(一般填self)斋枢,參數(shù)3:要執(zhí)行的方法帘靡,參數(shù)4:傳遞信息(可以以字典的形式,將信息傳遞給要執(zhí)行的方法)瓤帚,參數(shù)5:是否重復(fù)執(zhí)行描姚,如果NO,timer執(zhí)行一次后便失效戈次。
+(NSTimer *) timerWithTimeInterval:(NSTimerInterval *) ti target:(id)aTarget selector:(SEL) aSelector userInfo:(id)userInfo repeats:(Bool) yesOrNo;
//創(chuàng)建一個(gè)計(jì)時(shí)器轩勘,參數(shù)1:時(shí)間間隔(秒),參數(shù)2:表示發(fā)送的對(duì)象(一般填self)怯邪,參數(shù)3:要執(zhí)行的方法绊寻,參數(shù)4:傳遞信息(可以以字典的形式,將信息傳遞給要執(zhí)行的方法),參數(shù)5:是否重復(fù)執(zhí)行澄步,如果NO冰蘑,timer執(zhí)行一次后便失效。
+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimerInterval *)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(Bool)yesOrNo;
兩者區(qū)別:scheduledTimerWithTimeInterval方法創(chuàng)建完timer之后村缸,會(huì)自動(dòng)以NSDefaultRunLoopModel模式加入運(yùn)行循環(huán)祠肥。而timerWithTimeInterval方法創(chuàng)建的timer,不會(huì)自動(dòng)加入運(yùn)行循環(huán)梯皿,需要我們手動(dòng)指定模式仇箱,并手動(dòng)加入運(yùn)行循環(huán)。
//監(jiān)聽(tīng)用戶(hù)最基本的操作(觸摸东羹、點(diǎn)擊等)
FOUNDATION_EXPORT NSRunLoopMode const NSDefaultRunLoopMode;
//監(jiān)聽(tīng)一些特殊操作剂桥,滾動(dòng)等;
FOUNDATION_EXPORT NSRunLoopMode const NSRunLoopCommonModes
//在sheduledTimerWithTimeInterval方法中默認(rèn)的是NSDefaultRunLoopModel模式属提,而timerWithTimeInterval是可以指定這兩種模式的渊额。
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(run) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
- (void) run {
NSLog(@"---跑了,跳了@萋!旬迹!");
}
參考:NSTimer的基本使用
UI 選擇題
. UIViewController在顯示過(guò)程中,各個(gè)方法的調(diào)用順序是()
A. init -> viewDidLoad -> viewDidAppear -> viewDidUnload
B. init -> viewDidAppear -> viewDidLoad -> viewDidUnload
C. init -> viewDidLoad -> viewDidUnload -> viewDidAppear
D. init -> viewDidAppear -> viewDidUnload -> viewDidLoad
Key: A
解析:
[ViewController initWithCoder:]或[ViewController initWithNibName:Bundle]: 首先從歸檔文件中加載UIViewController對(duì)象求类。即使是純代碼奔垦,也會(huì)把nil作為參數(shù)傳給后者。
[UIView awakeFromNib]: 作為第一個(gè)方法的助手尸疆,方法處理一些額外的設(shè)置椿猎。
[ViewController loadView]:創(chuàng)建或加載一個(gè)view并把它賦值給UIViewController的view屬性。
-[ViewController viewDidLoad]: 此時(shí)整個(gè)視圖層次(view hierarchy)已經(jīng)放到內(nèi)存中寿弱,可以移除一些視圖犯眠,修改約束,加載數(shù)據(jù)等症革。
[ViewController viewWillAppear:]: 視圖加載完成筐咧,并即將顯示在屏幕上。還沒(méi)設(shè)置動(dòng)畫(huà)噪矛,可以改變當(dāng)前屏幕方向或狀態(tài)欄的風(fēng)格等量蕊。
[ViewController viewWillLayoutSubviews]即將開(kāi)始子視圖位置布局
[ViewController viewDidLayoutSubviews]用于通知視圖的位置布局已經(jīng)完成
[ViewController viewDidAppear:]:視圖已經(jīng)展示在屏幕上,可以對(duì)視圖做一些關(guān)于展示效果方面的修改艇挨。
[ViewController viewWillDisappear:]:視圖即將消失
[ViewController viewDidDisappear:]:視圖已經(jīng)消失
[ViewController dealloc:]:視圖銷(xiāo)毀的時(shí)候調(diào)用
. 使用imageNamed方法創(chuàng)建UIImage對(duì)象時(shí)残炮,與普通的init方法有什么區(qū)別()
A. 沒(méi)有區(qū)別,只是為了方便
B. imageNamed方法只是創(chuàng)建了一個(gè)指針缩滨,沒(méi)有分配其他內(nèi)存
C. imageNamed方法將圖片加載到內(nèi)存中后不再釋放
D. imageNamed方法將使用完圖片后立即釋放
Key: C
解析:
imageNamed是會(huì)把讀取到的image存在某個(gè)緩存里面势就,第二次讀取相同圖片的話(huà)系統(tǒng)就會(huì)直接從那個(gè)緩存中獲取泉瞻,從某種意義上好像一種優(yōu)化,但是imageNamed讀取到的那個(gè)圖片似乎不會(huì)因?yàn)镸emory Warning而釋放苞冯,所以用這個(gè)會(huì)導(dǎo)致在內(nèi)存不足的時(shí)候閃退袖牙。簡(jiǎn)單的說(shuō)imageNamed采用了緩存機(jī)制,如果緩存中已加載了圖片抱完,直接從緩存讀就行了贼陶,每次就不用再去讀文件了刃泡,效率會(huì)更高 巧娱。
.什么是key window()
A. App中唯一的那個(gè)UIWindow對(duì)象
B. 可以指定一個(gè)key的UIWindow
C. 可接收到鍵盤(pán)輸入等事件的UIWindow
D. 不可以隱藏的那個(gè)UIWindow對(duì)象
Key: C
解析:
keyWindow的存在的意義,其實(shí)就是為了說(shuō)明當(dāng)前的window接管了這個(gè)控制器的view而已烘贴,你可以在keyWindow上加載你自己的建立的view了禁添。
. 模態(tài)視圖專(zhuān)用屬性有哪些()
A UIModalPresentationFullScreen,全屏狀態(tài)桨踪,是默認(rèn)呈現(xiàn)樣式老翘,iPhone只能全屏呈現(xiàn)。
B UIModalPresentationPageSheet锻离,它的寬度是固定的768點(diǎn)铺峭,在iPad豎屏情況下則全屏呈現(xiàn)。
C UIModalPresentationFormSheet汽纠,它的是固定的540x620點(diǎn)卫键,無(wú)論是橫屏還是豎屏情況下呈現(xiàn)尺寸都不會(huì)變化。
D UIModalPresentationCurrentContext虱朵,它與父視圖控制器有相同的呈現(xiàn)方式莉炉。
key: A、B碴犬、C絮宁、D
9.關(guān)于NSOperation queue的說(shuō)法,正確的是 ()
A 主要用于多線(xiàn)程并發(fā)處理
B 它是一個(gè)隊(duì)列服协,有嚴(yán)格的先進(jìn)先出
C 它不會(huì)遵守嚴(yán)格的先進(jìn)先出
D NSOperationQueue可以通過(guò)調(diào)整權(quán)重來(lái)調(diào)整隊(duì)列的執(zhí)行順序
key: A C D
解析:
首先NSOperationQueue是屬于多線(xiàn)程并發(fā)處理這一部分绍昂,它主要用來(lái)提供一個(gè)可添加的操作隊(duì)列,將一系列操作添加到隊(duì)列中偿荷,然后根據(jù)操作的優(yōu)先級(jí)和內(nèi)部操作依賴(lài)來(lái)決定操作執(zhí)行的順序治专。高優(yōu)先級(jí)的操作先于低優(yōu)先級(jí)執(zhí)行。一個(gè)操作所依賴(lài)的操作全部執(zhí)行完畢后才能執(zhí)行遭顶。所以A,C,D正確
10. 下列程序輸出是()
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
[ary addObject:str];
NSLog(@"%@%d",str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@"%@%d",str,[str retainCount]);
[ary removeAllObjects];
NSLog(@"%@%d",str,[str retainCount]);
key: -1, -1, -1
解析:
今天在看書(shū)上的一段代碼時(shí)张峰,發(fā)現(xiàn)NSString實(shí)例化時(shí),有時(shí)用的是initWithFormat方法棒旗,有時(shí)用的是stringWithFormat喘批,到底應(yīng)該如何選擇呢撩荣?
區(qū)別:
① initWithFormat是實(shí)例方法
只能通過(guò) NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 調(diào)用,但是必須手動(dòng)release來(lái)釋放內(nèi)存資源
② stringWithFormat是類(lèi)方法
可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World"] 調(diào)用饶深,內(nèi)存管理上是autorelease的餐曹,不用手動(dòng)顯式release。
RunLoop相關(guān)
.NSRunLoop的以下描述錯(cuò)誤的是()
A Runloop并不是由系統(tǒng)自動(dòng)控制的
B 有3類(lèi)對(duì)象可以被run loop監(jiān)控:sources敌厘,timers台猴,observers
C 線(xiàn)程是默認(rèn)啟動(dòng)run loop的
D NSTimer可手動(dòng)添加到新建的NSRunLoop中
key: C
解析:
A:Runloop的作用在于當(dāng)有事情要做時(shí)它使當(dāng)前的thread工作,沒(méi)有事情做時(shí)又使thread 休眠sleep俱两。Runloop并不是由系統(tǒng)自動(dòng)控制的饱狂,尤其是對(duì)那些新建的次線(xiàn)程需要對(duì)其進(jìn)行顯示的控制。
B:有3類(lèi)對(duì)象可以被run loop監(jiān)控:sources宪彩、timers休讳、observers。當(dāng)這些對(duì)象需要處理的時(shí)候尿孔,為了接收回調(diào)俊柔,首先必須通
過(guò) CFRunLoopAddSource ,CFRunLoopAddTimer 或者 CFRunLoopAddObserver 把這些對(duì)象放入run loop。 要停止接收它的回調(diào)活合,可以通過(guò)CFRunLoopRemoveSource從run loop中移除某個(gè)對(duì)象雏婶。
C:每一個(gè)線(xiàn)程都有自己的runloop, 主線(xiàn)程是默認(rèn)開(kāi)啟的,創(chuàng)建的子線(xiàn)程要手動(dòng)開(kāi)啟白指,因?yàn)镹SApplication 只啟動(dòng)main applicaiton thread留晚。
D:NSTimer默認(rèn)添加到當(dāng)前NSRunLoop中,也可以手動(dòng)制定添加到自己新建的NSRunLoop的中侵续。
.下面的一段代碼倔丈,打印值是()
NSString *str = @“l(fā)anou”;
[str retain];
NSLog(@“%lu”,str.retainCount);
A 1
B 2
C -1
D ULONG_MAX
key: D
解釋?zhuān)?/p>
這是一個(gè)放在常量區(qū)的字符串常量,返回的結(jié)果是UINT_MAX值
UITableView 相關(guān)
. 以下關(guān)于tableView編輯的方法中哪個(gè)不屬于代理方法()
A -(void)setEditing:(BOOL)editing animated:(BOOL)animated
B -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
C -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
D -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
key: A
解釋?zhuān)?/p>
A是tableView自己的方法状蜗,不是代理
下面哪些屬于UITableViewDelegate協(xié)議的方法()
A tableView:cellForRowAtIndexPath:
B tableView:numberOfRowsInSection:
C tableView:didSelectRowAtIndexPath:
D numberOfSectionsInTableView:
key: C
解析:
代理的作用是用來(lái)完成指定的某種動(dòng)作需五,所以必須是動(dòng)作性的操作而不是數(shù)據(jù)性的操作