美文网首页
基本面试

基本面试

作者: 夜雨聲煩_ | 来源:发表于2018-03-25 23:51 被阅读0次

1.为什么说Objective-C是一门动态的语言?

oc是由runtime实现的消息传递机制,可以动态的添加替换方法。而不是C那样传统的函数调用。类在oc中是动态创建的,然后根据runtime查出selector,method,imp等然后绑定上去,所谓的运行时绑定。

2.讲一下MVC和MVVM?

MVC就是传统的model,view,controller。model为数据模型,view提供视图展示,controller为控制器提供数据计算和视图控制。
MVC中C包括对数据处理,网络请求,并包含一些视图逻辑,过于臃肿,在此基础上提出MVVM。
MVVM中model和view与MVC中的view和model一致,多出来了viewModel,作为view和model的粘合剂,在这里进行数据的业务处理、网络请求等,这样就减轻了controller的负担。
controller就可以单纯的加载和处理页面逻辑,加载和处理viewmodel和view的关系。

3.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?

使用weak避免循环引用。如果使用strong,遵循代理的这个类要持有代理,代理里也要持有这个类,会造成循环引用,所以使用weak,使用weak不增加引用计数,不再有强引用、引用计数为0时也随之释放。
delegate,代理主要是去实现他的一些方法,比如tableview滑动时做一些事这类的。
datasource,数据源主要是需要一些数据,比如tableview有多少行、每行多高这类的。
block和代理都是倒叙传值。区别在于block比较方便,可以把实现直接写在block里。不用像代理那样声明协议遵循协议指定代理再实现代理那么麻烦。

4.属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?

成员变量+set方法+get方法。
readwrite,atomic。值类型:assign。引用类型:strong。
@synthesize 自动生成get、set方法,重命名变量。同时get、set方法同时重写是要手动加上@synthesize name = _name
@@dynamic 不自动生成get、set、方法。

5.NSString为什么要用copy关键字,如果用strong会有什么问题?

如果NSString使用strong类型,那么当将一个NSMutableString这样的可变字符串赋值给NSString之后,如果可变字符串改变值,字符串也会跟着改变。这是由于浅拷贝,只拷贝了内存地址。
如果使用了copy则为深拷贝,拷贝内容被分配新的地址。这样可变字符串改变时,字符串不会跟着改变。

6. 如何令自己所写的对象具有拷贝功能?

遵循NSCopying协议。
并显示copyWithZone方法。

7.为什么IBOutlet修饰的UIView也适用weak关键字

因为在xib中拖动添加控件的时候就已经加到父视图的subviews里了,已经带有强引用了,所以在于view关联时用weak也不会造成不释放。

8.nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?

首先涉及到原子性。原子性就是如果A给B转钱,A减少1000,B增加一千,如果发生了断电等特殊情况时,操作同时取消,不会发生A钱变少B钱没变多的情况。同时成功或同时失败被称为原子性。
atomic,原子性,安全,效率低。
nonatomic,非原子性,不安全,效率高。
通常使用nonatomic,因为通常属性不需要原子性。同时atomic只是读写安全,并不是绝对保证线程安全,只是通过原子性更好的避免出错,仍需要线程锁。

9. 进程和线程的区别?同步异步的区别?并行和并发的区别?

进程,系统运行的总称。
线程,进程的一个单位。
同步,阻塞当前线程,等待完成后继续线程
异步,不阻塞当前线程,开辟新的线线程同时进行

10.线程间通信?

主要用到在线程中dispatch_async(dispatch_get_main_queue()回到主线程刷新UI。

11.GCD的一些常用的函数?

回到主线程:dispatch_async(dispatch_get_main_queue()
创建异步线程:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
GCD延迟:dispatch_after
GCD只执行一次:dispatch_once
任务组:dispatch_group_t

12.如何使用队列来避免资源抢夺?

ios多线程——锁

13.数据持久化的几个方案

plist
userdefault
NSKeyedArchiver
coredata
realm

14.说一下appdelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?

didFinishLaunchingWithOptions 应用程序已启动
applicationDidBecomeActive 完全激活
applicationDidEnterBackground 进入后台
applicationWillEnterForeground 将进入前台

15.NSCache优于NSDictionary

NSCache在资源不足时会自动释放内存
NSCache线程安全

16.知不知道Designated Initializer?使用它的时候有什么需要注意的问题

初始化函数。alloc分配内存再使用Init初始化。

17.实现description方法能取到什么效果?

NSObject自带的方法,可以用来打印对象的内存地址。可以重写打印其属性以及我们需要的信息。

18.objc使用什么机制管理对象内存?

ARC,自动引用计数。当计数为0时释放内存。

19..block的实质是什么?

block的实质是匿名函数

20.为什么在默认情况下无法修改被block捕获的变量? __block都做了什么?

block捕获的是值内容,而非值地址。所以不能修改。
__block修饰变量则拷贝进block的是值地址,可以修改。

21.模拟一下循环引用的一个情况?block实现界面反向传值如何实现?

self持有block,block持有self,造成循环引用,在block前声明weakSelf并在block内使用weakSelf即可。

22.objc在向一个对象发送消息时,发生了什么?

根据对象的isa指针找到类对象id,在查询类对象里面的methodLists方法函数列表与SEL,如果没有找到,在沿着superClass,寻找父类,再在父类methodLists方法列表里面查询,最终找到匹配SEL,call IMP(指针函数)。

23.什么时候会报unrecognized selector错误?iOS有哪些机制来避免走到这一步?

如果找到基类NSObject都没找到,就会调用NSObject里面的方法报错。
涉及到消息转发。一共三步。
第一步:resolove动态解析
第二步:fast forwarding重定向
第三步:normal forwarding重定向

24.能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?

前者不可以后者可以。
可以通过class_addvar和class_addmethod添加。

25.runtime如何实现weak变量的自动置nil?

当声明一个weak变量指向一个创建的对象后。实际上将创建对象的内存地址为key,将所有指向这个对象的weak变量为内容放进哈希表里。一旦对象引用计数为0,执行dealloc方法的同时,会根据这个对象的内存地址为key去哈希表里找到相应的内容并且清空。

26.给类添加一个属性后,在类结构体里哪些元素会发生变化?

instance_size :实例的内存大小
objc_ivar_list *ivars:属性列表

27.runloop是来做什么的?runloop和线程有什么关系?主线程默认开启了runloop么?子线程呢?

一般来讲线程一次只能执行一个任务,执行完就会结束。而我们需要一个机制,能随时处理消息而不退出。runloop正提供一个这样的函数,在函数内一直处于“接受消息-等待-处理”的循环中,直到循环结束。
runloop和线程的关系:如果一个线程想一直处于运行状态,就需要一个runloop。
主线程默认开启一个runloop,也就是这个runloop保证我们程序执行。子线程默认没有开启,可以获取,同时在第一次获取时创建。

28.runloop的mode是用来做什么的?有几种mode?

  • kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
  • UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
  • UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
  • GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
  • kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。

29.为什么把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时候NSTimer却不动了?

nstime对象是在NSDefaultRunLoopMode下面调用消息的,但是当我们滑动scrollview的时候,NSDefaultRunLoopMode模式就自动切换到UITrackingRunLoopMode模式下面,却不可以继续响应nstime发送的消息。所以如果想在滑动scrollview的情况下面还调用nstime的消息,我们可以把nsrunloop的模式更改为NSRunLoopCommonModes

30.项目中网络如何做信息安全?

  1. 使用https
    2.不要传输,使用hash加密
    3.请求尽量带上mac

31.main之前的过程?

编译,执行load方法。

相关文章

  • 【16】进大厂必须掌握的面试题-100个python面试

    我们整理了Python面试的主要问题清单,分为7个部分: 基本面试问题 OOPS面试问题 基本的Python程序 ...

  • 基本面试

    1.为什么说Objective-C是一门动态的语言? oc是由runtime实现的消息传递机制,可以动态的添加替换...

  • 校园面试中的特别注意事项

    上文美高校园面试的基本流程介绍了校园面试的基本流程,本文介绍几个校园面试中的特别注意。 面试从进入校门的那一刻就开...

  • 面试的构成要素

    面试要素是指构成任何一次面试活动必不可少的基本因素。面试因素有10个:面试目的、面试内容、面试方法、面试考官、面试...

  • 公务员考试面试基础精讲 面试本质与出题思路

    明晚讲什么是面试,面试题的基本类型与出题思路。 内容 面试考什么 面试题的基本类型 怎么办和怎么看 怎么办 你能否...

  • 写总结的目的

    本人不擅长面试环节: 基本每次面试都败北.记录面试题目鼓励自己,一起奋斗. 这里的面试总结demo均在github...

  • 面试的基本礼仪

    面试礼仪 (1)必要的自我介绍 准时赴约,最好提前十分钟到达,这样可以稍微平静一下心态,整理一下服饰,然后以饱满的...

  • Flutter面试:基本框架

    Flutter Framework: 纯 Dart实现的 SDK,类似于 React在 JavaScript中的作...

  • 招聘与配置(三)

    第三节 面试的组织与实施 第一单元 面试的基本程序 一、面试的概念 面试是指在特定的时间和地点,由面试考官与...

  • 栽在面试上,真的划不来。

    文/棕熊姐姐 我面试的次数不多,但基本每次都命中。 但是之前转行的时候,由于没有正确修改简历,导致基本面试资格都没...

网友评论

      本文标题:基本面试

      本文链接:https://www.haomeiwen.com/subject/letlcftx.html