群里搜集唯蝶,整理一下,侵刪遗嗽。
一粘我、 選擇題
1、 定義協(xié)議時(shí)痹换,在協(xié)議名稱后加上<NSOb ject>的作用是:
A.新定義的協(xié)議遵守<NSObject>協(xié)議征字。
B.新定義的協(xié)議是<NSOb ject>協(xié)議的子協(xié)議。
C.遵守新定義的協(xié)議的對(duì)象娇豫,也必須遵守<NSOb ject>協(xié)議匙姜。
D. 遵守新定義的協(xié)議的對(duì)象,必須是NSObject的子類冯痢。
2氮昧、 以下代碼存在的問(wèn)題是:
dispatch_queue_t queue = dispatch_queue_create("com.apple.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(actionTime:) userInfo:nil repeats:YES];
});
- (void)actionTime:(NSTimer *)timer {
NSLog(@"---- %@",[NSDate date]);
}
A.運(yùn)行時(shí)崩潰
B.死鎖
C.定時(shí)器不執(zhí)行
D.定時(shí)器只執(zhí)行一-次
3、 以下哪些情況容易造成循環(huán)引用?
A. dispatch async 的block 中使用self
B.使用strong 修飾delegate 屬性
C. self作為NSNotificationCenter 的observer
D. self作為所持有的NSTimer 的target
4浦楣、以下哪些類跟UIView有繼承關(guān)系(直接袖肥、間接的父類或子類) ?
A. UIControl
B. UIGestureRecognizer
C. CALayer
D. UIResponder
5 、下列關(guān)于OC消息機(jī)制說(shuō)法不正確的是?
A椒振、OC的實(shí)例對(duì)象的isa指針指向它的類對(duì)象昭伸,類對(duì)象的isa指針指向它的元類對(duì)象
B、OC的調(diào)用一個(gè)未實(shí)現(xiàn)的實(shí)例方法澎迎,我們可以在NSObject的resolveClassMethod中進(jìn)行添加方法進(jìn)行補(bǔ)救
C庐杨、OC可以運(yùn)用運(yùn)行時(shí)特性向Class的對(duì)象中動(dòng)態(tài)添加方法
D、OC的實(shí)例方法是存放在相應(yīng)實(shí)例對(duì)象的methodlist中夹供,靜態(tài)方法存在相應(yīng)的類對(duì)象的methodlist中的
E灵份、OC可以運(yùn)用運(yùn)行時(shí)特性向?qū)ο蟮腃ategory中實(shí)現(xiàn)動(dòng)態(tài)綁定屬性,達(dá)到category添加成員變量的效果
F哮洽、OC可以運(yùn)用運(yùn)行時(shí)特性通過(guò)class_ addIvar ()向編譯好的Class添加成員變量
6填渠、在HTTP請(qǐng)求中,返回代碼401和500代表下列哪兩種狀態(tài)
A:請(qǐng)求網(wǎng)頁(yè)不存在
B:未授權(quán)
C:服務(wù)器內(nèi)部錯(cuò)誤
D禁止訪問(wèn)
7、以下代碼輸出的日志是
dispatch_sync(dispatch_get_main_queue(), ^{
printf("1");
});
printf("2");
A. 12
B. 21
C.1
D.2
E. 無(wú)輸出
8氛什、在開發(fā)過(guò)程中莺葫,block的使用很容易造成內(nèi)存泄漏,對(duì)于下面代碼會(huì)不會(huì)造成內(nèi)存問(wèn)題? 需要如何處理?
[UIView animateWithDuration:0.25 animations:^{
self.alpha = 0;
}];
A.會(huì)造成內(nèi)存問(wèn)題
B. 不會(huì)造成內(nèi)存問(wèn)題
會(huì)的話枪眉, 要如何處理_______
9捺檬、以下代碼第二行編譯不通過(guò),修改不正確的是贸铜。
NSError * error = nil;
NSError ** plError = &error;
A.__strong NSError ** pError = &error;
B.NSError __strong ** pError = &error ;
C.NSError * __strong * pError = &error;
D. NSError ** __strong pError = &error;
10堡纬、runloop Observer 可以監(jiān)聽(tīng)的事件為:
A、進(jìn)入runloop和退出runloop
B 蒿秦、執(zhí)行完timer 事件
C烤镐、執(zhí)行source事件之前和執(zhí)行完source事件
D、等待前和喚醒后
參考答案(僅供參考棍鳖,如有誤請(qǐng)指正)
1炮叶、A、C
2鹊杖、C 解析:平時(shí)用定時(shí)器的時(shí)候 用scheduledTimerWithTimeInterval這個(gè)方法創(chuàng)建 實(shí)際上做了兩個(gè)操作 一個(gè)是創(chuàng)建了定時(shí)器 另一個(gè)是把創(chuàng)建完的定時(shí)器 放到runloop里 而且都是在主線程創(chuàng)建 默認(rèn)主線程的runloop是開啟的 所以不用管 但是到了子線程里 runloop不會(huì)默認(rèn)開啟 所以要手動(dòng)開啟runloop 才能啟動(dòng)定時(shí)器
3悴灵、B扛芽、D
4骂蓖、A、D
5川尖、B登下、D、F
6叮喳、B被芳、C
7、E 解析:死鎖
dispatch_sync在等待block語(yǔ)句執(zhí)行完成馍悟,而block語(yǔ)句需要在主線程里執(zhí)行畔濒,所以dispatch_sync如果在主線程調(diào)用就會(huì)造成死鎖
dispatch_sync是同步的,本身就會(huì)阻塞當(dāng)前線程锣咒,也即主線程侵状。而又往主線程里塞進(jìn)去一個(gè)block,所以就會(huì)發(fā)生死鎖毅整。
8趣兄、B PS:感覺(jué)是個(gè)坑。如果有誤悼嫉,請(qǐng)不吝賜教
9艇潭、D
10、A、D
// 1. 創(chuàng)建監(jiān)聽(tīng)者
/**
* 創(chuàng)建監(jiān)聽(tīng)者
*
* @param allocator#> 分配存儲(chǔ)空間
* @param activities#> 要監(jiān)聽(tīng)的狀態(tài)
* @param repeats#> 是否持續(xù)監(jiān)聽(tīng)
* @param order#> 優(yōu)先級(jí), 默認(rèn)為0
* @param observer 觀察者
* @param activity 監(jiān)聽(tīng)回調(diào)的當(dāng)前狀態(tài)
*/
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
/*
kCFRunLoopEntry = (1UL << 0), 進(jìn)入工作
kCFRunLoopBeforeTimers = (1UL << 1), 即將處理Timers事件
kCFRunLoopBeforeSources = (1UL << 2), 即將處理Source事件
kCFRunLoopBeforeWaiting = (1UL << 5), 即將休眠
kCFRunLoopAfterWaiting = (1UL << 6), 被喚醒
kCFRunLoopExit = (1UL << 7), 退出RunLoop
kCFRunLoopAllActivities = 0x0FFFFFFFU 監(jiān)聽(tīng)所有事件
*/
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"進(jìn)入");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"即將處理Timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"即將處理Source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即將休眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被喚醒");
break;
case kCFRunLoopExit:
NSLog(@"退出RunLoop");
break;
default:
break;
}
});
// 2. 添加監(jiān)聽(tīng)者
/**
* 給指定的RunLoop添加監(jiān)聽(tīng)者
*
* @param rl#> 要添加監(jiān)聽(tīng)者的RunLoop
* @param observer#> 監(jiān)聽(tīng)者對(duì)象
* @param mode#> RunLoop的運(yùn)行模式, 填寫默認(rèn)模式即可
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);