美文网首页面试题
iOS面试题手记(2)

iOS面试题手记(2)

作者: 萧哒哒 | 来源:发表于2021-02-24 10:12 被阅读0次

1.一个objc对象的isa的指针指向什么?有什么作用?

指向他的类对象,从而可以找到对象上的方法

2.一个 NSObject 对象占用多少内存空间?

*一个NSObject对象占用的大小其实就是一个isa指针的大小。在64bit是8字节。 但是!!系统* *真正分配内存的时候是分配了16字节!*

3.说一下对 class_rw_t 的理解?

rw代表可读可写,class_rw_t 中保存了Objc类的属性,方法,遵循的协议等信息

// 可读可写

struct class_rw_t {

// Be warned that Symbolication knows the layout of this structure.

uint32_t flags;

uint32_t version;

const class_ro_t *ro; // 指向只读的结构体,存放类初始信息

/*

这三个都是二位数组,是可读可写的,包含了类的初始内容、分类的内容。

methods中,存储 method_list_t ----> method_t

二维数组,method_list_t --> method_t

这三个二位数组中的数据有一部分是从class_ro_t中合并过来的。

*/

method_array_t methods; // 方法列表(类对象存放对象方法,元类对象存放类方法)

property_array_t properties; // 属性列表

protocol_array_t protocols; //协议列表

Class firstSubclass;

Class nextSiblingClass;

//...

}

3.说一下对 class_ro_t 的理解?

存储了当前类在编译器就已经确定的属性,方法以及遵循的协议

struct class_ro_t {

    uint32_t flags;

    uint32_t instanceStart;

    uint32_t instanceSize;

    uint32_t reserved;

    const uint8_t * ivarLayout;

    const char * name;

    method_list_t * baseMethodList;

    protocol_list_t * baseProtocols;

    const ivar_list_t * ivars;

    const uint8_t * weakIvarLayout;

    property_list_t *baseProperties;

};

4.说一下对 isa 指针的理解, 对象的isa 指针指向哪里?isa 指针有哪两种类型?

isa等价于is kind of,*实例对象isa指向类对象,类对象isa指向元类对象,元类对象isa指向元类的基类。

isa有两种,1*纯指针,指向内存地址 2**NON_POINTER_ISA,除了内存地址,还存有一些其他信息

5.实例对象的数据结构?

本质上objc_object的私有属性只有一个isa指针,指向类对象的内存地址

6.什么是method swizzling(俗称黑魔法)

简单来说就是方法交换,每个类都有一个方法列表,存着方法名字和实现的映射关系,selector的本质其实就是方法名,IMP有点类似函数指针,指向具体的Method实现,通过selector就可以找到对应的IMP。换方法的几种方式利用 method_exchangeImplementations 交换两个方法的实现,利用 class_replaceMethod替换方法的实现,利用 method_setImplementation 来直接设置某个方法的IMP

7.什么时候会报unrecognized selector的异常?

objc在向一个对象发送消息时,runtime库会根据isa指针找到该对象实际所属的类,然后再该类的方法列表及父类方法列表中寻找方法运行,如果在最顶层父类依然找不到对应方法,会进入消息转发阶段,如果消息三次转发流程任然未实现,程序会抛出这个异常。

8.如何给 Category 添加属性?关联对象以什么形式进行存储?

关联对象以哈希表的格式,存储在一个全局的单例中

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

不能向编译后得到的类中添加实例变量,能向运行时创建的类中添加实例变量

1.因为编译后的类已经注册在runtime中,类结构体中的实例变量离岸边和内存大小已确定,同时runtime会调用class_setvarlayout 或 class_setWeaklvarLayout 来处理strong weak 引用,所以不能添加

2.运行时创建的类是可以添加实例变量,调用class_addIvar函数. 但是的在调用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上.

10.类对象的数据结构?

类对象就是objc_class,是一个继承自objc_object结构体,所以包含isa指针

isa:指向元类

superClass:指向父类

Cache:方法的缓存列表

data:数据,是一个被封装好的class_rw_t

structobjc_class:objc_object{// Class ISA;Class superclass;//父类指针cache_t cache;// formerly cache pointer and vtable 方法缓存class_data_bits_t bits;// class_rw_t * plus custom rr/alloc flags 用于获取地址class_rw_t*data(){returnbits.data();// &FAST_DATA_MASK 获取地址值}

11.runtime如何通过selector找到对应的IMP地址?

每个类对象都有一个方法列表,方法列表中记录着方法的名称,实现一键参数类型,通过方法名称就可以在列表中找出对应的方法实现

12.objc中向一个nil对象发送消息将会发生什么?

向一个nil对象发送消息,在寻找对象的isa指针的时候就0地址返回了,不会出现任何错误

详解:

如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil);

如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*) ,float,double,long double 或者long long的整型标量,发送给nil的消息将返回0;

如果方法返回值为结构体,发送给nil的消息将返回0。结构体中各个字段的值将都是0;

如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的。

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

runtime会根据对象的isa指针找到该对象所属的类,然后再方法列表以及父类方法列表中寻找方法实现,如果一直到根类还没找到,转向拦截调用,走消息转发机制,一旦找到,就去执行他的IMP

14.isKindOfClass 与 isMemberOfClass

isKindOfClass 是确定一个对象是否是一个类的成员,或者是派生字该类

isMemberOfClass确定一个对象是否是当前类的成员

15.Category 在编译过后,是在什么时机与原有的类合并到一起的?

1.程序启动后,通过编译后,runtime初始化,调用_objc_init

2.然后会map_images

3.接下来调用map_images_nolock

4.然后read_images,读取所有的类的相关信息

5.最后调用reMethodizeClass,进行重新方法化

6.在reMethodizeClass内部会调用attachCategorise,这个方法会传入Class和Category,讲方法和协议列表与原有的类合并,最后加入到class_rw_t结构体中

16.Category 有哪些用途?

给系统类添加方法和属性(需要关联对象),对某个类大量方法,可以实现按照不同的名称归类

17.为什么 NSTimer 有时候不好使?

  因为创建的NSTimer默认被加入到defaultMode,当Runloop的Mode变化时,当前timer不工作

18.RunLoop的Mode有几种?
当RunLoop在Mode1上时,是无法接受Mode2或Mode3上的Source,Timer,Observer事件的
总共有五种CFRunLoopMode:
KCFRunLoopDefaultMode:默认模式,主线程就是在这个模式下运行
UITrackingRunLoopMode:跟踪用户交事件(用于ScrollView追踪滑动)
UIInitiazationRunLoopMode:刚启动App时进入的第一个Mode,启动完成后不再使用
GSEventReiviceRunLoopMode:接受系统内部事件,通常用不到
KCFRunLoopCommonModes:伪模式,不是一种真正的运行模式,是同步Source/Timer?Observer到多个Mode的一种解决方案

19.RunLoop与NSTimer
一个比较常见的问题:滑动tableView时,定时器还会生效吗?
默认情况下RunLoop运行在kCFRunLoopDefaultMode下,而当滑动tableView时,RunLoop切换到UITrackingRunLoopMode,而Timer是在kCFRunLoopDefaultMode下的,就无法接受处理Timer的事件。
怎么去解决这个问题呢?把Timer添加到UITrackingRunLoopMode上并不能解决问题,因为这样在默认情况下就无法接受定时器事件了。
所以我们需要把Timer同时添加到UITrackingRunLoopMode和kCFRunLoopDefaultMode上。
那么如何把timer同时添加到多个mode上呢?就要用到NSRunLoopCommonModes了

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Timer就被添加到多个mode上,这样即使RunLoop由kCFRunLoopDefaultMode切换到UITrackingRunLoopMode下,也不会影响接收Timer事件

20.AFNetworking 中如何运用 Runloop?

AFURLConnectionOperation 这个类是基于 NSURLConnection 构建的,其希望能在后台线程接收 Delegate 回调。为此 AFNetworking 单独创建了一个线程,并在这个线程中启动了一个 RunLoop.
RunLoop 启动前内部必须要有至少一个 Timer/Observer/Source,所以 AFNetworking 在 [runLoop run] 之前先创建了一个新的 NSMachPort 添加进去了。通常情况下,调用者需要持有这个 NSMachPort (mach_port) 并在外部线程通过这个 port 发送消息到 loop 内;但此处添加 port 只是为了让 RunLoop 不至于退出,并没有用于实际的发送消息。

21.PerformSelector 的实现原理?
当调用 NSObject 的 performSelecter:afterDelay: 或performSelector:onThread:后,实际内部会创建一个Timer并添加到当前线程的RunLoop中,如果当前线程没有RunLoop,方法会失效。
22.PerformSelector:afterDelay:这个方法在子线程中是否起作用?为什么?怎么解决?
不起作用,子线程默认没有RunLoop,也就没有Timer,办法是使用GCD来实现:
Dispath_after

23.RunLoop和线程
线程和RunLoop是意义对应的,隐射关系保存在一个全局字典中
自己创建的线程默认是不开启RunLoop的
1、怎么创建一个常驻线程?
1.为当前线程开启一个RunLoop(第一次调用 [NSRunLoop currentRunLoop]方法时实际是会先去创建一个RunLoop)
2.向RunLoop中添加一个维持RunLoop的时间循环(如果RunLoop的mode中一个item都没有,RunLoop会退出)
3.启动RunLoop

  @autoreleasepool {
        
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        
        [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        
        [runLoop run];
        
    }

2.怎样保证子线程数据回来更新UI的时候不打断用户的滑动操作?
我们就可以将更新UI事件放在主线程的NSDefaultRunLoopMode上执行即可,这样就会等用户不再滑动页面,主线程RunLoop由UITrackingRunLoopMode切换到NSDefaultRunLoopMode时再去更新UI

[self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO modes:@[NSDefaultRunLoopMode]];

24.RunLoop的数据结构
RunLoop设计五个类:
CFRunLoop:RunLoop对象
CFRunLoopMode:运行模式
CFRunLoopSource:输入源/事件源
CFRunLoopTimer:定时源
CFRunLoopObserver:观察者
1、CFRunLoop

由pthread(线程对象,说明RunLoop和线程是一一对应的)、currentMode(当前所处的运行模式)、modes(多个运行模式的集合)、commonModes(模式名称字符串集合)、commonModelItems(Observer,Timer,Source集合)构成

2、CFRunLoopMode

由name、source0、source1、observers、timers构成

3、CFRunLoopSource

分为source0和source1两种

source0:
即非基于port的,也就是用户触发的事件。需要手动唤醒线程,将当前线程从内核态切换到用户态
source1:
基于port的,包含一个 mach_port 和一个回调,可监听系统端口和通过内核和其他线程发送的消息,能主动唤醒RunLoop,接收分发系统事件。
具备唤醒线程的能力
4、CFRunLoopTimer

基于时间的触发器,基本上说的就是NSTimer。在预设的时间点唤醒RunLoop执行回调。因为它是基于RunLoop的,因此它不是实时的(就是NSTimer 是不准确的。 因为RunLoop只负责分发源的消息。如果线程当前正在处理繁重的任务,就有可能导致Timer本次延时,或者少执行一次)。

5、CFRunLoopObserver

监听以下时间点:CFRunLoopActivity

kCFRunLoopEntry
RunLoop准备启动

kCFRunLoopBeforeTimers
RunLoop将要处理一些Timer相关事件

kCFRunLoopBeforeSources
RunLoop将要处理一些Source事件

kCFRunLoopBeforeWaiting
RunLoop将要进行休眠状态,即将由用户态切换到内核态

kCFRunLoopAfterWaiting
RunLoop被唤醒,即从内核态切换到用户态后

kCFRunLoopExit
RunLoop退出

kCFRunLoopAllActivities
监听所有状态

25.RunLoop概念
RunLoop是通过维护内部的时间循环来对事件/消息进行管理的一个对象
1.没有消息时,休眠避免占用资源,有用户态切换到内核态
2.有消息处理,由内核态切换到用户态
为什么main函数不会退出?
UIApplicationMain内部默认开启了主线程的RunLoop,并执行了一段无限循环的代 码(不是简单的for循环或while循环)

26.解释一下 NSTimer
NSTimer 其实就是 CFRunLoopTimerRef,他们之间是 toll-free bridged 的。一个 NSTimer 注册到 RunLoop 后,RunLoop 会为其重复的时间点注册好事件。例如 10:00, 10:10, 10:20 这几个时间点。RunLoop 为了节省资源,并不会在非常准确的时间点回调这个Timer。Timer 有个属性叫做 Tolerance (宽容度),标示了当时间点到后,容许有多少最大误差。

27.什么是异步绘制?
就是可以在子线程把需要绘制的图形,提前在子线程处理好,讲准备好的图像数据直接返回给主线程使用,降低主线程的压力。
异步绘制过程:
通过系统的[view.delegate displayLayer:]入口实现异步绘制
*代理负责生成对应的 Bitmap
*设置该 Bitmap 为 layer.contents 属性的值。
28.利用 runloop 解释一下页面的渲染的过程?
当我们调用 [UIView setNeedsDisplay] 时,这时会调用当前 View.layer 的 [view.layer setNeedsDisplay]方法。

这等于给当前的 layer 打上了一个脏标记,而此时并没有直接进行绘制工作。而是会到当前的 Runloop 即将休眠,也就是 beforeWaiting 时才会进行绘制工作。

紧接着会调用 [CALayer display],进入到真正绘制的工作。CALayer 层会判断自己的 delegate 有没有实现异步绘制的代理方法 displayer:,这个代理方法是异步绘制的入口,如果没有实现这个方法,那么会继续进行系统绘制的流程,然后绘制结束。

CALayer 内部会创建一个 Backing Store,用来获取图形上下文。接下来会判断这个 layer 是否有 delegate。

如果有的话,会调用 [layer.delegate drawLayer:inContext:],并且会返回给我们 [UIView DrawRect:] 的回调,让我们在系统绘制的基础之上再做一些事情。

如果没有 delegate,那么会调用 [CALayer drawInContext:]。

以上两个分支,最终 CALayer 都会将位图提交到 Backing Store,最后提交给 GPU。

至此绘制的过程结束。

29.KVO (Key-value observing)
KVO就是观察者模式的另一实现,使用了isa混写(isa-swizzling)来实现KVO
使用setter方法改变值KVO会生效,使用setValue:forKey即KVC改变值KVO也会生效,因为KVC会去调用setter方法
通过赋值成员变量不会触发KVO,因为没有调用setter方法,需要加上willChangeValueForKey和didChangeValueForKey方法来手动触发才行

30.KVC(Key-value coding)

KVO可以允许开发者通过Key名直接访问对象属性或者给属性赋值,而不需要调用存取方法。这样就可以在运行时动态的访问和修改对象属性,而不是在编译时确定。

31.分类、扩展、代理
一、分类
1.分类作用?
声明私有方法,分解体积大的类文件,把framework的私有方法公开
2.分类特点
运行时决定,可以为系统类添加分类

32.请说一下对 CALayer 的认识
layer是图层绘制,渲染,以及动画的完成者,无法处理触摸事件,layer常见的属性有Frame、Bounds、Position、AnchorPoint、Contents 等等。

33.Block的几种形式
分为全局Block,堆Block,栈Block三种,其中栈Block存储在栈(stack)区,堆Block存储在堆(heap)区,全局Block存储在已初始化数据(.data)区

34.什么是Block?
Block是将函数及其执行上下文封装起来的对象。block内部有isa指针,所以说其本质也是OC对象

35.iOS 性能优化面试题
在性能优化中一个最具参考价值的属性是FPS:Frames Per Second,其实就是屏幕刷新率,苹果的iphone推荐的刷新率是60Hz,FPS值的大小体现了页面的流畅程度高低,当低于45的时候卡顿会比较明显。
一.入门级
1.用ARC管理内存
2、在正确的地方使用 reuseIdentifier
3.尽量把views设置成透明
4.避免过大的XIB
5.不要阻塞主线程
6.在ImageViews中调整图片大小,最好保证图片大小和imageView大小一致,缩放图片会耗费资源,可以在下载完成后用backgroundthread,缩放一次,然后在UIImageView中使用缩放后的图片。
7.正确使用Collection
8.打开gzip压缩
二.中级
1.重用和延迟加载(lazy load) Views
2.Cache
缓存那些不大可能经常改变但需要读取的东西,一些选项是,远端服务器的响应,图片,甚至计算结果,比如UITableView的行高。
3.权衡渲染方法.性能能还是要bundle保持合适的大小。
4.处理内存警告,移除对缓存,图片object和其他一些重创建的objects的strongreference
5.重用大开销对象
6.一些objects的初始化很慢,比如NSDateFormatter和NSCalendar。然而,你又不可避免地需要使用它们,比如从JSON或者XML中解析数据。想要避免使用这个对象的瓶颈你就需要重用他们,可以通过添加属性到你的class里或者创建静态变量来实现。
7.避免反复处理数据库,在服务端和客户端使用相同的数据结构
8.选择正确的数据格式
9.正确设定背景图片
10.减少使用Web特性,尽可能的移除不必要的js,避免使用过大的框架,尽可能的异步记载不影响页面表达的js
11.、Shadow Path 。CoreAnimation不得不先在后台得出你的图形并加好阴影然后才渲染,这开销是很大的。使用shadowPath的话就避免了这个问题。使用shadow path的话iOS就不必每次都计算如何渲染,它使用一个预先计算好的路径。
12.优化tableview
正确使用reuseIdentifier来重用cells
尽量使所有的view opaque,包括cell自身
避免渐变,图片缩放,后台选人
缓存行高
如果cell内现实的内容来自web,使用异步加载,缓存请求结果
使用shadowPath来画阴影
减少subviews的数量
尽量不适用cellForRowAtIndexPath:,如果你需要用到它,只用-一次然后缓存结果
使用正确的数据结构来存储数据
使用rowHeight, sectionFooterHeight 和 sectionHeaderHeight来设定固定的高,不要请求delegate
13、选择正确的数据存储选项
三、高级
1.加速启动时间,尽可能多的异步任务,编码庞大的XIB
2.使用Autorelease Pool
3.选择是否缓存图片
4.避免日期格式转化
平时你是如何对代码进行性能优化的?

利用性能分析工具检测,包括静态 Analyze 工具,以及运行时 Profile 工具,通过Xcode工具栏中Product->Profile可以启动,

比如测试程序启动运行时间,当点击Time Profiler应用程序开始运行后.就能获取到整个应用程序运行消耗时间分布和百分比.为了保证数据分析在统一使用场景真实需要注意一定要使用真机,因为此时模拟器是运行在Mac上,而Mac上的CPU往往比iOS设备要快。

为了防止一个应用占用过多的系统资源,开发iOS的苹果工程师门设计了一个“看门狗”的机制。在不同的场景下,“看门狗”会监测应用的性能。如果超出了该场景所规定的运行时间,“看门狗”就会强制终结这个应用的进程。开发者们在crashlog里面,会看到诸如0x8badf00d这样的错误代码。

36.光栅化
光栅化是将几何数据经过一系列变化后最终转换成像素,从而呈现在显示设备的过程,本质是坐标变化和几何离散化。
当UItableview和UICollectionView的cell样式一样是,可以使用这个属性提高性能

cell.layer.shouldRasterize=YES;

cell.layer.rasterizationScale=[[UIScreenmainScreen]scale];


37.日常如何检查内存泄露?
目前我知道的方式有以下几种:
Memory Leaks
Alloctions
Analyse
Debug Memory Graph
MLeaksFinder
泄露的内存主要有一下两种:
1.Laek Memory 忘记Relase操作所泄露的内存
2.Abandon Memory 循环引用,无法释放掉的内存
38.如何高性能的画一个圆角?

视图和圆角的大小对帧率并没有什么卵影响,数量才是伤害的核心输出
label.layer.cornerRadius = 5
label.layer.masksToBounds = true

上面的方法不可取,会出发离屏渲染:
*如果能够只用 cornerRadius 解决问题,就不用优化。

*如果必须设置 masksToBounds,可以参考圆角视图的数量,如果数量较少(一页只有几个)也可以考虑不用优化。

*UIImageView的圆角可以通过直接截取图片实现。其他视图的圆角可以通过Core Graphics画出圆角矩形实现

39.如何提升 tableview 的流畅度?
本质上是降低 CPU、GPU 的工作,从这两个大的方面去提升性能。

*CPU:对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制
*GPU:纹理的渲染
40.如何优化 APP 的电量?
程序的耗电主要在以下四个方面:CPU,定位,网络,图像
*尽可能降低CPU,GPU的功耗
*少用定时器
*优化I/O操作:
*不要频繁写入小数据,积攒到一定数量在写入
*读写大量数据可使用 Dispatch_io ,GCD 内部已经做了优化。
*数据量比较大,建议使用数据库
*网络方面的优化
*减少压缩网络数据
*请求数据返回相同,使用NSCache缓存
*使用断点续传,避免因网络失败后重新下载
*网络不可用时,不提供网络请求
*长时间网络请求,提供取消操作
*批量传输,下载视频流的时候,尽量一大块一大块的进行下载,广告可以一次下
载多个
*定位层面的优化
* 如果只是需要快速确定用户位置,最好用 CLLocationManager 的 requestLocation 方法。定位完成后,会自动让定位硬件断电
*如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
*尽量降低定位精度,比如尽量不要使用精度最高的 kCLLocationAccuracyBest
*需要后台定位时,尽量设置 pausesLocationUpdatesAutomatically 为 YES,如果用户不太可能移动的时候系统会自动暂停位置更新
*尽量不要使用 startMonitoringSignificantLocationChanges,优先考虑 startMonitoringForRegion:
*硬件检测优化
*用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

41.如何有效降低 APP 包的大小?
可执行文件
*编译器优化
**Strip Linked Product、Make Strings Read-Only、Symbols Hidden by Default 设置为 YES
**去掉异常支持,Enable C++ Exceptions、Enable Objective-C Exceptions 设置为 NO, Other C Flags 添加 -fno-exceptions
*利用 AppCode 检测未使用的代码:菜单栏 -> Code -> Inspect Code
*编写LLVM插件检测出重复代码、未被调用的代码
资源
*资源包括 图片、音频、视频 等

42.什么是 离屏渲染?什么情况下会触发?该如何应对?
离屏渲染就是在当前屏幕缓冲区以外,新开辟一个缓冲器进行操作
离屏渲染出发的场景有以下:
*圆角(maskToBounds并用才会触发)
*图层蒙版
*阴影
*光栅化
为什么要避免离屏渲染?
CPU GPU 在绘制渲染视图时做了大量的工作。离屏渲染发生在 GPU 层面上,会创建新的渲染缓冲区,会触发 OpenGL 的多通道渲染管线,图形上下文的切换会造成额外的开销,增加 GPU 工作量。如果 CPU GPU 累计耗时 16.67 毫秒还没有完成,就会造成卡顿掉帧。

43.NSThread+runloop实现常驻线程
*由于每次开辟子线程都会消耗cpu,在需要频繁使用子线程的情况下,频繁开辟子线程会消耗大量的cpu,而且创建线程都是任务执行完成之后也就释放了,不能再次利用,那么如何创建一个线程可以让它可以再次工作呢?也就是创建一个常驻线程。

+ (NSThread *)shareThread {
    
    static NSThread *shareThread = nil;
    
    static dispatch_once_t oncePredicate;
    
    dispatch_once(&oncePredicate, ^{
        
        shareThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadTest2) object:nil];
        
        [shareThread setName:@"threadTest"];
        
        [shareThread start];
    });
    
    return shareThread;
}

+ (void)threadTest
{
    @autoreleasepool {
        
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        
        [runLoop run];
    }
}

44.自旋锁与互斥锁
自旋锁会忙等: 所谓忙等,即在访问被锁资源时,调用者线程不会休眠,而是不停循环在那里,直到被锁资源释放锁。
互斥锁会休眠: 所谓休眠,即在访问被锁资源时,调用者线程会休眠,此时cpu可以调度其他线程工作。直到被锁资源释放锁。此时会唤醒休眠线程。

45.内存中的5大区分别是什么?
栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。
堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。
文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放。
程序代码区:存放函数体的二进制代码。

相关文章

  • iOS 面试题及答案

    面试题集锦 iOS面试题及答案1iOS面试题及答案2iOS进阶面试题及答案3 一. CoreAnimation 相...

  • IOS面试(2018)

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

  • ios-面试题链接(四)

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

  • 2018 iOS面试题系列

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

  • iOS面试题手记(2)

    1.一个objc对象的isa的指针指向什么?有什么作用? 2.一个 NSObject 对象占用多少内存空间? 3....

  • 面试题汇总

    ? 1. 基础 细说@property iOS基础面试题1(5.16) iOS基础面试题2 (5.24) 标哥(黄...

  • 2019 iOS面试题大全

    1、2018 iOS面试题---UI相关:事件传递,图像显示,性能优化,离屏渲染 2、2018 iOS面试题---...

  • 2019 全方位直击iOS面试

    1、2018 iOS面试题---UI相关:事件传递,图像显示,性能优化,离屏渲染 2、2018 iOS面试题---...

  • iOS最新面试题汇总(四)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(三)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

网友评论

    本文标题:iOS面试题手记(2)

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