騰訊 2021年移動客戶端開發面試題
- 管理員
- 1374閱讀
- 2021.06.19
一、不定項選擇
(iOS開發選做)實現多線程都有哪幾種方法?
?
A? 使用@synchronized(self)
B? 使用GCD
C? 使用NSOperationQueue
D? 使用@thread
答案:A B C
?Intent傳遞數據時,下列的數據類型哪些可以被傳遞
?
A? Serializable
B? charsequence
C? Parcelable
D? Bundle
?答案:ABCD
解析:
Serializable :將 Java 對象序列化為二進制文件的 ? ? Java 序列化技術是 Java系列技術中一個較為重要的技術點,在大部分情況下,開發人員只需要了解被序列化的類需要實現 ? ? Serializable 接口,使用ObjectInputStream 和 ObjectOutputStream 進行對象的讀寫。
charsequence??:
在JDK1.4中,引入了CharSequence接口,實現了這個接口的類有:CharBuffer、String、StringBuffer、StringBuilder這個四個類。
CharBuffer為nio里面用的一個類,String實現這個接口理所當然,StringBuffer也是一個CharSequence,StringBuilder是Java抄襲C#的一個類,基本和StringBuffer類一樣,效率高,但是不保證線程安全,在不需要多線程的環境下可以考慮。
提供這么一個接口,有些處理String或者StringBuffer的類就不用重載了。但是這個接口提供的方法有限,只有下面幾個:charat、length、subSequence、toString這幾個方法,感覺如果有必要,還是重載的比較好,避免用instaneof這個操作符。 ? ?
Parcelable??: ? ?
android提供了一種新的類型:Parcel。本類被用作封裝數據的容器,封裝后的數據可以通過Intent或IPC傳遞。?除了基本類型以
外,只有實現了Parcelable接口的類才能被放入Parcel中。
是GOOGLE在安卓中實現的另一種序列化,功能和Serializable相似,主要是序列化的方式不同
?Bundle:Bundle是將數據傳遞到另一個上下文中或保存或回復你自己狀態的數據存儲方式。它的數據不是持久化狀態。
?在android中使用Menu時可能需要重寫的方法有?
??????
A? onCreateOptionsMenu()
B? onCreateMenu()
C? onOptionsItemSelected()
D? onItemSelected()
答案:?A C
解析:
android中有三種菜單
(1)選項菜單Options menus :一個Activity只能有一個選項菜單,在按下Menu鍵時,顯示在屏幕下方。
(2)上下文菜單Context menus :為Activity中的任何一個視圖注冊一個上下文菜單,“長按”出現。
(3)彈出式菜單Popup menus :依賴于Activity中的某個一個視圖。
?android中使用SQLiteOpenHelper這個輔助類時,可以生成一個數據庫,并可以對數據庫版本進行管理的方法可以是?
?????
A? getWriteableDatabase()
B? getReadableDatabase()
C? getDatabase()
D? getAbleDatabase()
答案:A B
?android 關于service生命周期的onCreate()和onStart()說法正確的是?
?
A? 當第一次啟動的時候先后調用onCreate()和onStart()方法
B? 當第一次啟動的時候只會調用onCreate()方法
C? 如果service已經啟動,將先后調用onCreate()和onStart()方法
D? 如果service已經啟動,只會執行onStart()方法,不在執行onCreate()方法
答案:AD
解析:當第一次啟動的時候先后調用onCreate()和onStart()方法 ? , ? 如果service已經啟動,再次啟動的話只會執行onStart()方法,不在執行onCreate()方法 ? 。
?下面是屬于GLSurFaceView特性的是?
?
A? 管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。
B? 管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
C? 讓渲染器在獨立的線程里運作,和UI線程分離。
D? 可以直接從內存或者DMA等硬件接口取得圖像數據
答案:ABC
解析:
GLSurfaceView是一個視圖,繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。
????????GLSurfaceView提供了下列特性:
????????????????1> ? ? 管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。
????????????????2> 管理一個EGL ? ?display,它能讓opengl把內容渲染到上述的surface上。
????????????????3> ? ? 用戶自定義渲染器(render)。
????????????????4> ? ? 讓渲染器在獨立的線程里運作,和UI線程分離。
????????????????5> ? ? 支持按需渲染(on-demand)和連續渲染(continuous)。
????????????????6> ? ? 一些可選工具,如調試。
?模態視圖專用屬性有哪些?
???
A? UIModalPresentationFullScreen,全屏狀態,是默認呈現樣式,iPhone只能全屏呈現。
B? UIModalPresentationPageSheet,它的寬度是固定的768點,在iPad豎屏情況下則全屏呈現。
C? UIModalPresentationFormSheet,它的是固定的540x620點,無論是橫屏還是豎屏情況下呈現尺寸都不會變化。
D? UIModalPresentationCurrentContext,它與父視圖控制器有相同的呈現方式。
答案:A B C D
?NSAssert類似的宏有哪些?
??
A? NSAssert1
B? NSAssert2
C? NSAssert3
D? NSAssert4
答案:A B C D
解析:
#define NSAssert(condition, desc, ...) ? ?? ?
#define NSAssert5(condition, desc, arg1, arg2, arg3, arg4, ? ? ? ?arg5) NSAssert((condition), (desc), (arg1), (arg2), (arg3), ? ? ? ?(arg4), (arg5))
?AddressBookUI框架中的視圖控制器?
??????
A? ABPeoplePickerNavigationController
B? ABPersonViewController
C? ABNewPersonViewController
D? ABUnknownPersonViewController
答案:ABCD
解析:視圖控制器包括UIViewController
?創建聯系人使用的函數有哪些?
?????
A? ABPersonCreate
B? ABRecordSetValue
C? ABMultiValueCreateMutable
D? ABAddressBookSave
答案:A B C D
?修改聯系人使用的函數有哪些?
?????????
A? ABPersonCreate
B? ABRecordSetValue
C? ABAddressBookGetPersonWithRecordID
D? ABAddressBookAddRecord
答案:C D
?表視圖的相關類有哪些?
?
A? UITableView
B? UITableViewController
C? UITableViewDelegate
D? UITableViewDataSource
答案:A B
解析:AB是類 CD是代理方法
?iOS中導航設計模式有幾種?
??????
A ?平鋪導航
B? 標簽導航
C? 樹形導航
D? 模態視圖導航
答案:A B C
解析:
我們經常會遇到在某個路徑中滑出一個單屏、進行編輯、查看信息、操作界面的上的內容的情況發生。這是一種應用行為的特定形態,一般帶有流程的界面變更的情況發生,比如一張頁面臨時取代了整個應用程序的顯示屏,我們稱這種處理方式為“模態視圖”。默認情況下,模式視圖從屏幕底部邊緣滑上來切一半覆蓋了當前整個屏幕,模態視圖完成和程序主功能有關系的獨立任務,尤其適合于主功能界面中欠缺的多級子任務。這種操作會暫時繞開應用的正常操作。
模態視圖常常被用來編輯或添加內容,當你需要的時候模態視圖一般從屏幕底部滑出而后遮蓋先前的頁面,當你完成任務后滑出的頁面也會相應的縮回去,然后可以繼續之前的流程。有些控件和界面元素只在次要任務中被偶爾用到,模態視圖很好的把他們暫時隱藏了,并且當需要的時候出現,有效的節約了屏幕空間。
模態視圖有點像是導航中的死胡同,為了能夠讓用戶也可以同樣方便的回到正常的流程中去,模態視圖除了正常的操作之外一般還有加上一個“完成”按鈕,或者“取消”按鈕。
?為什么說Object-C是runtime language?
??????
A? 將數據類型的確定由編譯時,推遲到了運行時
B? 運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
C? 駕駛A繼承了B類,那么在編譯時就已經生成了A的實例
D? 多態是指不同對象以自己的方式響應相同的消息的能力
答案:A B D
?android通過startService的方式開啟服務,關于service生命周期的onCreate()和onStart()?說法正確的是哪兩項
???????
A? 當第一次啟動的時候先后調用?onCreate()和?onStart()方法
B? 當第一次啟動的時候只會調用?onCreate()方法
C? 如果?service?已經啟動,將先后調用?onCreate()和?onStart()方法
D? 如果?service?已經啟動,只會執行?onStart()方法,不在執行?onCreate()方法
答案:AD
?解析:
1. startService()的目的是回調onStart()方法,onCreate() ? 方法是在Service不存在的時候調用的,如果Service存在(例如之前調用了bindService,那么Service的onCreate方法已經調用了)那么startService()將跳過onCreate() ? 方法。
????? 2.? ?bindService()目的是回調onBind()方法,它的作用是在Service和調用者之間建立一個橋梁,并不負責更多的工作(例如一個Service需要連接服務器的操作),一般使用bindService來綁定到一個現有的Service(即通過StartService啟動的服務)。
??????由于Service ? 的onStart()方法只有在startService()啟動Service的情況下才調用,故使用onStart()的時候要注意這點。
?二、問答題
??????? Android中Looper的實現原理,為什么調用Looper.prepare()就在當前線程關聯了一個Looper對象,它是如何實現的。
?1、線程間通信機制
首先,looper、handler、messagequeue三者共同實現了android系統里線程間通信機制。如在A、B兩個子線程之間需要傳遞消息,首先給每個子線程綁定一套handler、looper、messagequeue機制,然后這三個對象都與其所屬線程對應。然后A線程通過調用B線程的Handler對象,發送消息。這個消息會被Handler發送到B線程的messagequeue中,而屬于B線程的Looper對象一直在for循環里無限遍歷MessageQueue, ? 一旦發現該消息隊列里收到了新的消息,就會去對消息進行處理,處理過程中會回調自身Handler的heandleMessage方法。從而實現了不同線程間通信。
2、Looper實現原理
Looper類里包含一個消息隊列對象和一個線程對象。當創建Looper時,會自動創建一個消息隊列,同時將內部線程對象指向創建Looper的線程。當開啟Looper后(looper.loop()),會自動進入無限for循環中,不斷去遍歷消息隊列,如果沒有消息則阻塞,有消息則回調handler的handlemessage方法進行處理。
3、Looper.prepare()
首先,要使用Looper機制一般會在當前線程中創建Handler對象,里面會自動創建一個looper對象和消息隊列,這里面的消息隊列屬于當前線程空間。但此時的looper還不會去遍歷,也沒有綁定到當前線程。其中,looper對象內部也包含一個空消息隊列對象和空線程。通過Looper.prepare()方法,先讓該消息隊列指向當前線程的消息隊列,讓空線程也指向當前線程。從而實現了綁定。
?簡述Andriod如何處理UI與耗時操作的通信,有哪些方式及各自的優缺點。
?1、啟動worker線程進行耗時操作,通過Handler機制實現線程間通信。
2、AsyncTask處理
3、啟用Service和broadcast廣播
4、runOnUiThread()
5、post()
?用Object-C定義并實現一個基于數組的循環隊列類,當隊列放滿需支持動態的擴展隊列長度。