腾讯 2021年移动客户端开发面试题

小编:管理员 1324阅读 2021.06.19

第1题:


一、不定项选择

(iOS开发选做)实现多线程都有哪几种方法?

 

A  使用@synchronized(self)

B  使用GCD

C  使用NSOperationQueue

D  使用@thread



答案:A B C


第2题:


 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是将数据传递到另一个上下文中或保存或回复你自己状态的数据存储方式。它的数据不是持久化状态。



第3题:


 在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中的某个一个视图。



第4题:


 android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是?

     

A  getWriteableDatabase()

B  getReadableDatabase()

C  getDatabase()

D  getAbleDatabase()



答案:A B


第5题:


 android 关于service生命周期的onCreate()和onStart()说法正确的是?

 

A  当第一次启动的时候先后调用onCreate()和onStart()方法

B  当第一次启动的时候只会调用onCreate()方法

C  如果service已经启动,将先后调用onCreate()和onStart()方法

D  如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法



答案:AD

解析:当第一次启动的时候先后调用onCreate()和onStart()方法   ,   如果service已经启动,再次启动的话只会执行onStart()方法,不在执行onCreate()方法   。


第6题:


 下面是属于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>     一些可选工具,如调试。


第7题:


 模态视图专用属性有哪些?

   

A  UIModalPresentationFullScreen,全屏状态,是默认呈现样式,iPhone只能全屏呈现。

B  UIModalPresentationPageSheet,它的宽度是固定的768点,在iPad竖屏情况下则全屏呈现。

C  UIModalPresentationFormSheet,它的是固定的540x620点,无论是横屏还是竖屏情况下呈现尺寸都不会变化。

D  UIModalPresentationCurrentContext,它与父视图控制器有相同的呈现方式。



答案:A B C D


第8题:


 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))



第9题:


 AddressBookUI框架中的视图控制器?
      

A  ABPeoplePickerNavigationController

B  ABPersonViewController

C  ABNewPersonViewController

D  ABUnknownPersonViewController



答案:ABCD

解析:视图控制器包括UIViewController



第10题:


 创建联系人使用的函数有哪些?
     

A  ABPersonCreate

B  ABRecordSetValue

C  ABMultiValueCreateMutable

D  ABAddressBookSave



答案:A B C D



第11题:


 修改联系人使用的函数有哪些?
         

A  ABPersonCreate

B  ABRecordSetValue

C  ABAddressBookGetPersonWithRecordID

D  ABAddressBookAddRecord



答案:C D


第12题:


 表视图的相关类有哪些?

 

A  UITableView

B  UITableViewController

C  UITableViewDelegate

D  UITableViewDataSource



答案:A B

解析:AB是类 CD是代理方法



第13题:


 iOS中导航设计模式有几种?

      

A  平铺导航

B  标签导航

C  树形导航

D  模态视图导航



答案:A B C

解析:

我们经常会遇到在某个路径中滑出一个单屏、进行编辑、查看信息、操作界面的上的内容的情况发生。这是一种应用行为的特定形态,一般带有流程的界面变更的情况发生,比如一张页面临时取代了整个应用程序的显示屏,我们称这种处理方式为“模态视图”。默认情况下,模式视图从屏幕底部边缘滑上来切一半覆盖了当前整个屏幕,模态视图完成和程序主功能有关系的独立任务,尤其适合于主功能界面中欠缺的多级子任务。这种操作会暂时绕开应用的正常操作。

模态视图常常被用来编辑或添加内容,当你需要的时候模态视图一般从屏幕底部滑出而后遮盖先前的页面,当你完成任务后滑出的页面也会相应的缩回去,然后可以继续之前的流程。有些控件和界面元素只在次要任务中被偶尔用到,模态视图很好的把他们暂时隐藏了,并且当需要的时候出现,有效的节约了屏幕空间。

模态视图有点像是导航中的死胡同,为了能够让用户也可以同样方便的回到正常的流程中去,模态视图除了正常的操作之外一般还有加上一个“完成”按钮,或者“取消”按钮。



第14题:


 为什么说Object-C是runtime language?

      

A  将数据类型的确定由编译时,推迟到了运行时

B  运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

C  驾驶A继承了B类,那么在编译时就已经生成了A的实例

D  多态是指不同对象以自己的方式响应相同的消息的能力



答案:A B D


第15题:


 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()的时候要注意这点。



第16题:


 二、问答题

        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()方法,先让该消息队列指向当前线程的消息队列,让空线程也指向当前线程。从而实现了绑定。


第17题:


 简述Andriod如何处理UI与耗时操作的通信,有哪些方式及各自的优缺点。



 1、启动worker线程进行耗时操作,通过Handler机制实现线程间通信。

2、AsyncTask处理

3、启用Service和broadcast广播

4、runOnUiThread()

5、post()


第18题:


 用Object-C定义并实现一个基于数组的循环队列类,当队列放满需支持动态的扩展队列长度。


关联标签: