1. 程式人生 > >直擊應聘現場,程式設計師筆試,有苦不能說

直擊應聘現場,程式設計師筆試,有苦不能說

金九銀十已經過去,但是也不能阻擋程式猿們跳槽,尋找一份自己滿意的工作。 本人收到一位程式設計師前兩天面試中碰到的筆試問題,整理出一份自己的見解跟答案,具體內容如下:

持續關注:邏輯教育-楚陽,持續輸出各大公司iOS面試系列文章,歡迎廣大程式猿找我投稿面試中碰到的面試題,我會給你一份我的見解和答案,我前面已經分享100道我招聘的面試題,加入下方iOS技術交流群624212887直接獲取;

現場照片

第一題:請舉例至少三條以上會造成UITableView卡頓的情況

1、上方這個註釋我們可以翻譯為。只加載緩衝好的圖片,新的下載直到scrolling end,就是上拉下拉結束以後才去進行下載圖片然後重新整理 2、 使用不透明檢視。 3、 重複建立不必要的table cell。 4、 檢視的數目過多 5、 多餘的繪製工作。 6、 沒有預渲染影象。 7、 阻塞主執行緒。 tableView卡頓解決方案: 1.最常用的就是cell的重用,註冊重用識別符號(每當需要顯示cell的時候,都會先去緩衝池中尋找可迴圈利用的cell,如果沒有再重新建立cell) 2.減少cell中控制元件的數量(view是很大的物件,建立它會消耗較多資源,並且也影響渲染的效能。所以不用的不要加上去,不適用的可以先隱藏) 3.少使用addView 給cell動態新增view. 4.使用不透明檢視(半透明情況下app需要消耗效能去渲染,不透明的檢視可以極大地提高渲染的速度)。 5.使用區域性更新(如果只是更新某組的話,使用reloadSection進行區域性更新) 6.載入網路資料,下載圖片,使用非同步載入,並快取. 7.不要實現無用的代理方法,tableView只遵守兩個協議. 8.使用正確的資料結構來儲存資料。 9.當處理一些全屏大圖一類的耗資源的操作,可以用預渲染影象,在bitmap context裡先將其畫一遍,匯出成UIImage物件,然後再繪製到螢幕。

第二題:ID型別的delegate屬性到底是用assign還是weak,請簡述原因

@property (nonatomic, assign, readwrite) id delegate; 宣告一個delegate,那麼即便delegate指向的物件銷燬了,delegate中依然會儲存之前物件的地址 即,delegate成為了一個野指標… 而使用weak,則不會有上述問題,當delegate指向的物件銷燬後,delegate = nil, 所以答案就是,使用weak。

第三題:為什麼IBOutlet修飾的UIView也適用weak關鍵詞

因為當我們將控制元件拖到Storyboard上,相當於新建立了一個物件,而這個物件是加到檢視控制器的view上,view有一個subViews屬性,這個屬性是一個數組,裡面是這個view的所有子view,而我們加的控制元件就位於這個陣列中,那麼說明,實際上我們的控制元件物件是屬於view的,也就是說view對加到它上面的控制元件是強引用。當我們使用Outlet屬性的時候,我們是在viewController裡面使用,而這個Outlet屬性是有view來進行強引用的,我們在viewController裡面僅僅是對其使用,並沒有必要擁有它,所以是weak的。 如果將weak改為strong,也是沒有問題的,並不會造成強引用迴圈。當viewController的指標指向其他物件或者為nil,這個viewController銷燬,那麼對控制元件就少了一個強引用指標。然後它的view也隨之銷燬,那麼subViews也不存在了,那麼控制元件就又少了一個強引用指標,如果沒有其他強引用,那麼這個控制元件也會隨之銷燬。 不過,既然沒有必將Outlet屬性設定為strong,那麼用weak就好了

第四題:題目:iOS一般有幾種快取方式,請一一舉例

iOS本地快取資料方式有六種: 1.直接寫檔案方式:可以儲存的物件有NSString、NSArray、NSDictionary、NSData、NSNumber,資料全部存放在一個屬性列表檔案(*.plist檔案)中。 2.NSUserDefaults(偏好設定),用來儲存應用設定資訊,檔案放在perference目錄下。 3.歸檔操作(NSkeyedArchiver),不同於前面兩種,它可以把自定義物件存放在檔案中。 4.coreData:coreData是蘋果官方iOS5之後推出的綜合型資料庫,其使用了ORM(Object Relational Mapping)物件關係對映技術,將物件轉換成資料,儲存在本地資料庫中。coreData為了提高效率,甚至將資料儲存在不同的資料庫中,且在使用的時候將本地資料放到記憶體中使得訪問速度更快。我們可以選擇coreData的資料儲存方式,包括sqlite、xml等格式。但也正是coreData是完全面向物件的,其在執行效率上比不上原生的資料庫。除此之外,coreData擁有資料驗證、undo等其他功能,在功能上是幾種持久化方案最多的。 5.FMDB:FMDB是iOS平臺的SQLite資料庫框架,FMDB以OC的方式封裝了SQLite的C語言API,使用起來更加面向物件,省去了很多麻煩、冗餘的C語言程式碼,對比蘋果自帶的Core Data框架,更加輕量級和靈活,提供了多執行緒安全的資料庫操作方法,有效地防止資料混亂。 6.Realm:跨平臺的,底層實現核心是C++寫的, FMDB是基於SQLite的封裝. 所以他們的實現原理就不一樣. Realm直接可以儲存模型物件.

第五題:題目:請任意一個面向物件的語言簡要實現一個抽象工廠模式

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述 以下實現用的java來實現的抽象工廠

第六題: 題目:假設有一個字串aabcad,請寫一段程式,去掉字串中不相鄰的重複字串,及上述字串處理之後的輸出結果為:aabcd

在這裡插入圖片描述