明天第一次iOS面試,這兩天看了些面試題 ?,還是把有些不會(huì)的題目 記錄下來(lái)
Let's go
1.self.name = @"object " ?和 _name = @"object"的不同?
前者是通過(guò)點(diǎn)語(yǔ)法修改屬性name, 相當(dāng)于調(diào)用 setter 方法
[self setName:@"object"]
后者只是單純的把_name 指針指向@"object"所在的地址
2.簡(jiǎn)述面向?qū)ο蟮奶攸c(diǎn),特別是多態(tài)
封裝 ?,繼承 ? ,多態(tài)
1.封裝
把客觀事物封裝成抽象類
優(yōu)點(diǎn):增強(qiáng)安全性和簡(jiǎn)化編程,,使用者不必了解具體細(xì)節(jié),只需要調(diào)用外部接口,隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié).加快后期開(kāi)發(fā)速度.
2.繼承
繼承父類,擁有父類的所有方法與屬性,并在此基礎(chǔ)上擴(kuò)展(無(wú)需重新編寫原來(lái)的類)
優(yōu)點(diǎn):簡(jiǎn)化編程
3.多態(tài)
父類的指針可以指向子類的對(duì)象.OC 是的方法都是虛方法,不看指針看對(duì)象.
不同的對(duì)象以自己的響應(yīng)方式響應(yīng)相同的消息的能力叫做多態(tài).
生物類(life) ?有方法- eat ?,人和豬都是生物類的子類,,他們的 eat 不相同.
多態(tài)是為了實(shí)現(xiàn)一個(gè)目的----接口重用.(向 eat 方法的重用)
3.OC 所有對(duì)象間的交互是如何實(shí)現(xiàn)的?
正向:拿到接收的指針即可
反向:
1.委托代理
2.觀察者模式(一對(duì)多)
3.block
4.AppDelegate (這是一個(gè)生命周期與進(jìn)程一致的對(duì)象)
4.發(fā)送10個(gè)網(wǎng)絡(luò)請(qǐng)求,然后再接收到所有回應(yīng)之后執(zhí)行后續(xù)操作,如何實(shí)現(xiàn)?
關(guān)于多線程,可以供 GCD 的 barrier 實(shí)現(xiàn)(group 同理),但用 barrier 不能使用 dispatch_get_global_queue,
dispatch_queue_t queue ?queue = ? dispatch_queue_create("one",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,^{
//111
});
dispatch_async(queue,^{
//222
});
//執(zhí)行完上面兩個(gè)執(zhí)行下面的方法
dispatch_barrier_async(queue,^{
//在上面兩個(gè)執(zhí)行完之后執(zhí)行
});
下面用 group 做
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_group_t groupQueue = dispatch_group_create();
dispatch_group_async(groupQueue,queue,^{
//111
});
dispatch_group_async(groupQueue,queue,^{
//222
});
dispatch_group_notify(groupQueue,queue,^{
//上面執(zhí)行完了 執(zhí)行這個(gè)
});
4.不同版本的 app ,數(shù)據(jù)庫(kù)結(jié)構(gòu)變化了,如何處理
如果是移動(dòng)端,很簡(jiǎn)單,最暴力的方法 只需要把原先的數(shù)據(jù)庫(kù)刪了,導(dǎo)入新的數(shù)據(jù)庫(kù)文件即可.
如果是客戶端,那是客戶端的問(wèn)題,根 iOS 移動(dòng)端開(kāi)發(fā)沒(méi)多大關(guān)系,,,需要與客戶端開(kāi)發(fā)者溝通,,畢竟項(xiàng)目是多人合作才能完成的.
5.定義一個(gè) block ,接收參數(shù)與返回值為 int 型,其他隨意
typedef ?int (^myBlock)(int ?a, int b);
myBlock ?firstBlock;
firstBlock = ^(int a,int b){
};
6.堆和棧的區(qū)別
這個(gè)要說(shuō)可以說(shuō)很多啊
簡(jiǎn)單來(lái)說(shuō):
堆 :程序員手動(dòng)申請(qǐng),程序員手動(dòng)釋放 ?,遵守黃金法則,誰(shuí)申請(qǐng),誰(shuí)釋放.
棧:編譯器自動(dòng)申請(qǐng),自動(dòng)釋放..一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)
7.關(guān)于 UITableviewCell 的重用機(jī)制
通過(guò)重用單元格來(lái)節(jié)省內(nèi)存
為每個(gè) cell 指定一個(gè)重用標(biāo)示符.
例子:假如一個(gè) tableView 有十個(gè) cell, 但一開(kāi)始顯示4個(gè),系統(tǒng)一開(kāi)始只分配了4個(gè) cell 的內(nèi)存,,當(dāng)滾動(dòng)的時(shí)候, 屏幕內(nèi)顯示的單元格重復(fù)使用這四個(gè)內(nèi)存.
8.簡(jiǎn)單地說(shuō) sizeClass 的作用
sizeClass 是 iOS8之后出現(xiàn)的,,與 autoLayout 配合解決所有ios 設(shè)備屏幕尺寸以及旋轉(zhuǎn)時(shí)的 UI 適配.
例子:sizeClass 可以做到一個(gè) button ,在豎屏的時(shí)候,放在左上角,,而當(dāng)橫屏的時(shí)候,出現(xiàn)在右上角.
9.寫出一個(gè) update 語(yǔ)句,修改 User 表中 id 等于4的 UserName 值為張三
update User set UserName = '張三' ?where id = 4
insert into student(name, age) values ('Jonny',19)
create table if not exists student (id integer primary key,name text,age integer)
select * from student where name = 'maggie'
10.nil ,Nil,NULL,NSNULL
nil: 空的對(duì)象
Nil: 空的類?
NULL: 指C 里面的變量(NSInteger ,CGFloat)
NSNULL: 空的集合
11.寫出至少三個(gè)使用單例模式的系統(tǒng)類
NSUserDefault
NSFileManager
UIAPPlication
NSNotificationCenter
NSFileHandle
12.json 語(yǔ)法規(guī)則
json 是輕量級(jí)數(shù)據(jù)交換格式,寫出 json 的例子甩他一臉
{} [] 都是對(duì)應(yīng)的 ?
{
"key" : "value"
"name":"zhang",
"age":19,
"lovers":[
"1號(hào)",
"2號(hào)",
"3號(hào)"
]
}
13.如何實(shí)現(xiàn)圖文混排
1.webView 拼接 html 可以實(shí)現(xiàn)
2.iOS sdk中為我們提供了一套完善的文字排版開(kāi)發(fā)組件:CoreText捏顺。CoreText庫(kù)中提供了很多的工具來(lái)對(duì)文本進(jìn)行操作六孵,例如CTFont、CTLine幅骄、CTFrame等劫窒。利用這些工具可以對(duì)文字字體每一行每一段落進(jìn)行操作。
14.自動(dòng)登錄的邏輯
當(dāng)用戶勾選了自動(dòng)登錄 ?,每次到登錄頁(yè)面 ,去 UserDefault 中取得用戶名和密碼(加密過(guò)的),然后發(fā)送登錄請(qǐng)求即可
15.應(yīng)用間跳轉(zhuǎn)用到的關(guān)鍵參數(shù)是什么
scheme ? myApp:// ?參數(shù)1= 1&參數(shù)2 =2 ? 自定義協(xié)議
16.assign vs weak ?和 __block vs __weak
assign 指的是基本變量 (NSINteger 或 CGFloat),
weak 指的是對(duì)象 ,調(diào)用 setter 方法時(shí),,引用計(jì)數(shù)不加1
__block :block 可以訪問(wèn)局部變量,但不能修噶i,要是局部變量定義了__ block 就可以修改了.
__weak: 是弱引用,調(diào)用 setter 時(shí),引用計(jì)數(shù)不加1.當(dāng) self 釋放時(shí).?在 block 中使用可以防止循環(huán)引用. __weak typeof (self) weakSelf = self;
17盡可能寫出 NSObject 類包含的方法
description
alloc
dealloc
NSStringFromClass
NSSelectorFromString
responseToSelector
?isKindOf
isMemberOf
18.iOS 單元測(cè)試框架有哪些
Xcode 自帶的XCTest和第三方的GHUnit
19.CALayer 和 UIView 區(qū)別
UIView 是iOS 上 所有界面元素基類. 它本身是由 CoreAnimation實(shí)現(xiàn)的.而真正的繪圖部分,是由 CALayer 的類來(lái)管理的. UIView 本身更像是一個(gè) CALayer 的管理類,實(shí)現(xiàn) UIView ,內(nèi)部都是在訪問(wèn)CALayer的相關(guān)屬性.
實(shí)現(xiàn)圓角
?view.layer.cornerRadius = 17;
view.layer.borderWith = 10;
[view.layer maskToBounds]
20.沙盒的目錄結(jié)構(gòu)是怎么樣的?用于什么場(chǎng)合?
1.bundle 容器(只讀)
MyAPP.app
2.data 容器(可讀可寫)
1.Document :蘋果建議鍵程序中創(chuàng)建或?yàn)g覽的文件放在這里 ,iTunes 會(huì)同步
2.Library:( Library/cache ,Library/Preferences/xxx.plist)緩存文件,iTunes 不會(huì)同步
3.Tmp:創(chuàng)建和存放臨時(shí)文件的地方,會(huì)刪除拆座。
21.多線程的幾種方式
pThread,NSThread ,GCD NSOperation
pThread純C 可以跨平臺(tái). 說(shuō)明兼容性好, 缺點(diǎn) 對(duì)于某個(gè)平臺(tái) 優(yōu)化型不強(qiáng)
NSThread:
NSThread蘋果早期的多線程技術(shù)- 已經(jīng)被淘汰了
//最高度自定義化的 也是最難寫的 一般不用 ?NSLock 會(huì)用到
GCD: 最流行寫的
同步:同與主線程,在主線程上運(yùn)行sync
異步:異于主線程,在非主線程上運(yùn)行async
并行:多個(gè)任務(wù)同時(shí)進(jìn)行,即多個(gè)任務(wù)在不同的線程運(yùn)行concurrent
串行:多個(gè)任務(wù)在一個(gè)線程上排隊(duì)運(yùn)行,有序的serial
NSOperation 就是對(duì)GCD的一個(gè)封裝OC 把C語(yǔ)法封裝成了OC語(yǔ)法.額外的添加了5個(gè)特殊功能
任務(wù)的創(chuàng)建主要使用:NSBlockOperation
關(guān)于Operation 比GCD多的功能
1.可以限制最大的線程執(zhí)行數(shù)—并發(fā)數(shù)
例如:可以同時(shí)下載5個(gè)文件:有10個(gè)文件, 開(kāi)始下載5個(gè),當(dāng)?shù)谝粋€(gè)完成, 第6個(gè)會(huì)補(bǔ)充進(jìn)來(lái)
2.暫停線程(已執(zhí)行任務(wù)無(wú)效)
3.取消當(dāng)前線程 (已執(zhí)行任務(wù)無(wú)效)
5.取消某個(gè)任務(wù)的執(zhí)行,
22.KVO and KVC ?有什么作用
kvo 鍵值觀察模式,為一個(gè)屬性添加觀察,,當(dāng)屬性改變時(shí),做出相應(yīng)動(dòng)作,,簡(jiǎn)化了編碼
Key-Value Observing (KVO) 建立在 KVC 之上主巍,它能夠觀察一個(gè)對(duì)象的 KVC key value 值的變化冠息。
KVC 鍵值編碼模式,,通過(guò)字符串訪問(wèn)對(duì)象的屬性,做到 OC 做不到的事.
setValue for key ? ?解析 json 時(shí)會(huì)用到 ?setValuesForKeyWithDictionary, 大大減少代碼量
[persion valueForKeyPath:@"phone.battery" ]
[persion setValue:@"hufeng"forKey:@"name"];
23.同步請(qǐng)求和異步請(qǐng)求什么區(qū)別?
同步:都在主線程中執(zhí)行.
異步:在分線程中執(zhí)行,可以一起執(zhí)行.
24.單例是什么 ?什么時(shí)候使用
在整個(gè)程序中只創(chuàng)建一次,只用同一塊內(nèi)存.
如何多個(gè)模塊都要使用同一個(gè)變量,那這個(gè)變量可以升為單例.
如果說(shuō)創(chuàng)建一個(gè)對(duì)象會(huì)耗費(fèi)很多系統(tǒng)資源,那么此時(shí)采用單例模式孕索,因?yàn)橹恍枰粋€(gè)實(shí)例铐达,會(huì)節(jié)省alloc的時(shí)間
static Person *p;
dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
p = [[Person alloc]init];
});
25.OC中創(chuàng)建線程的方法有哪些?如果想延時(shí)執(zhí)行代碼,方法是什么?
NSThread*thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(startLongTimeWork:)object:nil];
//需要手動(dòng)開(kāi)啟線程
[threadstart];
dispatch_queue_tqueue =dispatch_queue_create("AsyncConcurrent",DISPATCH_QUEUE_CONCURRENT);
//新式寫法---使用block來(lái)創(chuàng)建操作/任務(wù)
NSBlockOperation*op3 = [NSBlockOperationblockOperationWithBlock:^{
[selfprintMinus];
}];
//如果想讓代碼在主隊(duì)列里有序執(zhí)行
[[NSOperationQueuemainQueue]addOperation:op3];
//讓op3和op4在多線程(非主)中并行
NSOperationQueue*queue1 = [NSOperationQueuenew];
//[queue1 addOperation:op3];
延時(shí):
1.self performSelector:() withObject:<> afterDelay:
2.[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
3.[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];
4.GCD//? when 時(shí)間 從現(xiàn)在開(kāi)始經(jīng)過(guò)多少納秒
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0* NSEC_PER_SEC));
void(^task)() = ^ {
// 延遲操作執(zhí)行的代碼
NSLog(@"%@", [NSThread currentThread]);
};
// 經(jīng)過(guò)多少納秒,由主隊(duì)列調(diào)度任務(wù)異步執(zhí)行
dispatch_after(when, dispatch_get_main_queue(), task);
// 先執(zhí)行就是異步檬果,后執(zhí)行就是同步
NSLog(@"come here");
26.OC 的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?Category 是什么?重寫一個(gè)類的方法用繼承好還是分類好?為什么?
不能多繼承 ? .
可以通過(guò)定義多個(gè)協(xié)議 實(shí)現(xiàn)多個(gè)接口
category 是分類 ,為已經(jīng)存在的類添加額外的犯法,擴(kuò)展是沒(méi)有名字的分類.
分類只能擴(kuò)充方法瓮孙,一般情況下不能擴(kuò)展屬性和成員變量(用 runtime 機(jī)制可以在分類中添加屬性).而擴(kuò)展可以.擴(kuò)展都是私有的..如果分類中聲明了一個(gè)屬性,那么分類只會(huì)生成這個(gè)屬性的set选脊、get方法聲明杭抠,也就是不會(huì)有實(shí)現(xiàn)。
建議使用分類,,繼承a is a b的關(guān)系恳啥,而分類只需要滿足a has a b的關(guān)系,局限性小..
?比較靈活,不用定義子類就能添加方法 ?,僅對(duì)本 category 有效 ,不會(huì)影響其他類與原有類的關(guān)系,耦合度小.,
例子:繼承 你需要調(diào)用子類 才能使用這個(gè)方法,,而分類 你直接可以用原類就能調(diào)用這個(gè)方法.簡(jiǎn)單了很多.
27.SDWebImage 原理 ? AFNetWorking 原理
SDWebImage:下載圖片,現(xiàn)在 Document中創(chuàng)建一個(gè)文件,請(qǐng)求圖片資源, 用 NSFileHandle 把接收到的 data 寫入這個(gè)文件,,下載完畢后, 顯示這個(gè)圖片..在沒(méi)下載完之前,可以顯示 placeholder 中的圖片:
AFNetWorking:封裝了 請(qǐng)求網(wǎng)絡(luò)的方法
實(shí)際上封裝了NSURLSessionConfiguration . NSURLSession. NSURLSessionDataTask
NSURLSessionConfiguration*configuration = [NSURLSessionConfigurationdefaultSessionConfiguration];
//第三個(gè)參數(shù)為nil,默認(rèn)就是子線程
NSURLSession *session = [NSURL SessionsessionWithConfiguration: configuration delegate: self delegateQueue: nil];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
28.app 的生命周期
1.willFinishLaunching ?準(zhǔn)備啟動(dòng)
2.didFinishLaunching ?啟動(dòng)
3. didBecomeActive ? ?活動(dòng)狀態(tài)
4.willResignActive ? ? 將要進(jìn)入非活動(dòng)狀態(tài)
5.DidEnterBackground ? 進(jìn)入后臺(tái)
6.willEnterForeground ?進(jìn)入前臺(tái)
7.willTerminate ?將要退出
29.NSInteger 和 int 的區(qū)別
在64位系統(tǒng)操作上,NSInteger 是 C語(yǔ)言的long 類型, 在32位系統(tǒng)上,則是 int 類型.
30.runtime
運(yùn)行時(shí):直到運(yùn)行時(shí)才確定類的類型.
動(dòng)態(tài)的添加方法 和實(shí)力變量 ?.比如可以在 category 中通過(guò)運(yùn)行時(shí)機(jī)制 添加屬性.
31.國(guó)際化
project 找到 Localization ?,點(diǎn)擊+號(hào),添加想要支持的語(yǔ)言.
通過(guò)新建 Strings文件. ?鍵值對(duì) ?,同一個(gè)key 在不同語(yǔ)言的文件中值不一樣.
調(diào)用 NSLocalizedStringFormTable 通過(guò) key ,獲得 ios 設(shè)備語(yǔ)言對(duì)應(yīng)的字符.
32.實(shí)現(xiàn)線程同步?
@synthronized(){} ?添加同步鎖
NSLock
dispatch_async(dispatch_get_main_queue(),^{}) ?異步主線程
NSOperationQueue :添加依賴,,,設(shè)置最大并發(fā)數(shù)為1.
累死我了 ? 等我面完試,再壯大這個(gè)內(nèi)容,,成為面霸!!!
職業(yè)發(fā)展:
因?yàn)槲椰F(xiàn)在做的是iOS ,所以近幾年 肯定是往移動(dòng)開(kāi)發(fā)這方面 發(fā)展的,,我打算在做 iOS 的同時(shí) ,去自學(xué) Android. 到時(shí)學(xué)好這兩個(gè) ,開(kāi)發(fā)起來(lái)更方便...
過(guò)幾年之后, 等我有一定代碼量,,我覺(jué)得我會(huì)往架構(gòu)師發(fā)展,, 因?yàn)槲矣X(jué)得架構(gòu)是一個(gè)項(xiàng)目最重要的部分,,好的架構(gòu)才能有好的項(xiàng)目.
碰到困難,放棄了怎么辦 ?你怎么看:
我認(rèn)為沒(méi)有一項(xiàng)工作時(shí)沒(méi)有困難的,,如果碰到困難,想盡一切辦法解決它,我相信沒(méi)有解決不了的困難,,只是看能不能堅(jiān)持而已..
那些碰到困難就退縮的人是還沒(méi)有準(zhǔn)備好工作的...
興趣沒(méi)了 就放棄了 你怎么看:
我選擇這個(gè)行業(yè) ,我認(rèn)為是一半為了興趣,(因?yàn)槲掖_實(shí)很喜歡蘋果的東西),還有一半是為了生活...我相信沒(méi)有百分之百的興趣,工作中肯定會(huì)遇到很多困難讓你覺(jué)得其實(shí)這個(gè)也不是想象的那么好玩 ?, 能堅(jiān)持下來(lái)都是靠自己的意志 ? 去解決一個(gè)又一個(gè)的困難的...