以下的這些問題都是些本人在之前找工作的時候遇到的面試問題,我就做了些整理,大概如下,供大家參考下。
一 (這是個直播類的公司的面試問題)
1、KVC和KVO區別
2、內存管理機制是什么樣的?
3、輪播圖片的實現方法
4、tableview的代理方法有哪些
5、運行時的機制
6、tableview的復用的原理?
7、圖文混排的做法
8、響應鏈是什么?
9、針對項目,假如在scrollview上加scrollview或tableview,只讓下面的滑動
10、多線程闡述
11、git命令 舉個例。
12、bilibili首頁的分析
二(這是個做金融類的公司)
1、自動布局,類似微信的朋友圈
2、輪播圖片的實現方法
3、推送原理
4、上架流程
5、SDWebImage的內部實現
6、緩存技術 大概闡述下。
7、瀑布流,怎么檢測每列最小的y值
8、自己實現一個tableview和瀑布流
9、自己電腦生成的那個鑰匙串有什么用處(生成證書的時候用的)
10、推送的時候,服務器發送的令牌,包含著什么內容
11、輪播圖片的時候,假如有定時器,怎么讓這個輪播順暢執行
12、nstimer和一個什么東西的區別,忘了名字了!(忽略吧)
13、MVC模式簡要說明
14、XML解析的原理 ,有哪些三方的庫。
15、多線程的使用場景
16、開發中遇到的最大問題
17、是否對數據庫了解,fmdb 、sqlite3
18、git和SVN的命令 舉例
三 (這是個外包公司的問題,問題里面全是坑)
1.在父視圖上[UIButton new]時,給左上一個15的約束,會有什么情況發生。
答:由于新建的button沒有放在父視圖,所以會引發崩潰。
2.用masonry寫個離父視圖邊距15的純代碼
答:make.left.mas_equalTo(self.view.mas_left).offset(15);
3.在父視圖上添加一個scrollView 后加一個button或label,怎么添加約束
4.怎么處理網絡緩存
5.怎么處理圖片緩存,怎么刪除緩存
6.AFN2.0和3.0的manager有什么區別(單例和非單例的區別),其他的還有什么區別。
7.SDWebImage的緩存策略,對于圖片怎么處理的,以及api接口是哪一個。
sd_setImageWithUrl:(NSUrl *)url placeholder:(UIImage *)image;
8.熱修復的原理
9.代碼沖突怎么查找,怎么解決,
答:在代碼中找到>>>>>>>>
表示沖突的開始位置。
找到<<<<<<<
表示代碼沖突的結束位置。
此外還有=========
10.數據庫sql語句的添加(新增)字段怎么實現。
答:
添加字段:
alter table 表名 add 字段名 類型
刪除字段:
alter table 表名 drop column 字段名
11.最新的xcode版本(他覺得我沒有開發過iOS 我去。。。)
12.怎么實現最大并發數
NSOPerationQueue的類
// 最好設置最大并發數為2~3
self.queue.maxConcurrentOperationCount = 3;
13.除此之外問了很多api接口的代碼。
14.處理block需要注意的有那些?
答:(1)在使用block前需要對block指針做判空處理。
(2)在MRC的編譯環境下,block如果作為成員參數要copy一下將棧上的block拷貝到堆上
(3)在block使用之后要對,block指針做賦空值處理,如果是MRC的編譯環境下,要先release掉block對象。
(4)使用方將self或成員變量加入block之前要先將self變為__weak
(5)在多線程環境下(block中的weakSelf有可能被析構的情況下),需要先將self轉為strong指針,避免在運行到某個關鍵步驟時self對象被析構。
第四、第五條合起來有個名詞叫weak–strong dance,
參考:http://www.cnblogs.com/biosli/p/block_usage.html
四(也是半外包類的公司)
1.緩存的處理:可以用字典進行處理。
2.對于緩存所占內存過高的時候的處理辦法:一般就是設置一個上限值,例如100M,加入緩存達到上限值的話,就可以刪除一些沒有用的緩存,來降低緩存所占的內存。
3.運行時原理以及消息轉發
4.KVO的底層實現原理:就是對對象進行一個拷貝,生成一個全新的對象,對新的對象的屬性的進行觀測,觀測到新舊兩個對象的屬性值的變化,其中在類的對象中的isa指針會指向類。
5.深拷貝和淺拷貝
6.用socket來封裝CFNetworking的實現原理
7.HTTP和TCP/IP的為什么叫短連接和長連接:對于這兩個協議來說都是流服務,HTTP是在建立了流服務的連接后,會維持一段時間自動斷開連接,且下次連接還需要進行一次完成流程的連接,這是不會有記憶功能的,所以是可靠的。但是TCP/IP的連接是就是在連接完成后,不會自動斷開連接,仍然保持連接,所以稱為長連接。
8.對于id類型為啥是所以類型的父類:由于是id類型來源NSObject的對象,而其他的類都是繼承自NSObject的,所以其他的對象是繼承id。
9.對于id來創建對象,為什么不加 * :由于在NSObject創建對象的時候就會有個了,而id只是對其的進一步的封裝,所以不用在id再加上了。
10.為什么在tableView上添加一個輪播圖片,在下滑上拉的時候,輪播圖片停止滾動:原因就是輪播圖片加在當前的runloop會自動的停掉。所以滑動界面的時候會使得輪播圖片停止滾動,這時需要把輪播圖片添加到其他的runLoop中去,這樣就算有滑動頁面也不會使得輪播圖片停止滾動。
11.GCD中的mainQueue和globalQueue有什么區別:mainqueue的話是主隊列,這是同步執行的,而globalQueue是可以異步的執行任務的。
12.解決手勢沖突的代碼:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// 輸出點擊的view的類名
// 若為UITableViewCellContentView(即點擊了tableViewCell),則不截獲Touch事件
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
[NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]
判斷這個手勢是否添加到相應的控件上。
13.FMDB在多線程中的問題:FMDB是支持多線程的,需要用到的是FMDatabaseQueue,[FMDatabaseQueue databaseQueueWithPath:path]
,然后可以處理多線程的問題,但是在對于多線程安全問題,在同時操作數據庫的時候需要異步的執行inDataBase或inTransaction來進行。
五
1.怎么上傳圖片到服務器,詳細流程。
2.事件傳遞,
3.c指針問題
4.自定義控件怎么傳遞事件給控制器,幾種方式。
5.mvc
6.cell上顯示網絡數據,網絡很慢,cell進了復用池怎么搞
7.你在項目中怎么處理ipv6的問題的
通過getaddrinfo轉換ipv4得到ipv6地址(這里我也被坑過了低版本的系統轉換不了ipv6,想測試只能升級系統),獲得ipv6地址后,可以判斷地址字符串是否用“:” 來確定使用哪一種socket的通訊方式,判斷方法:std::strdchr(const char* value, const char* subStr)
,如果是NULL,則使用ipv4 socket連接