iOS面试题整理收藏ios面试疯子

iOS | 面试知识整理 - 内存管理 (五)

2019-08-17  本文已影响0人  Leon_520

前言:

最近公司项目不怎么忙, 闲暇时间把iOS 在面试中可能会遇到的问题整理了一番, 一部分题目是自己面试遇到的,一部分题目则是网上收录的, 方便自己巩固复习, 也分享给大家! 知识点比较多,比较杂,这里做了分类,下面是分类链接地址;

面试知识点整理 - 目录:

iOS | 面试知识整理 - OC基础 (一)
iOS | 面试知识整理 - OC基础 (二)
iOS | 面试知识整理 - OC基础 (三)
iOS | 面试知识整理 - UI 相 关 (四)
iOS | 面试知识整理 - 内存管理 (五)
iOS | 面试知识整理 - 多 线 程 (六)
iOS | 面试知识整理 - 网络相关 (七)
iOS | 面试知识整理 - 数据持久化 (八)
iOS | 面试知识整理 - Swift 基础 (九)

iOS | 面试知识整理 - 内存管理(五)

1.什么是内存泄漏?

2. 什么是僵尸对象?

3. 野指针

4. 什么是空指针?

5. OC对象的内存管理机制?

在iOS中,使用引用计数来管理OC对象的内存

内存管理的经验总结

可以通过以下私有函数来查看自动释放池的情况

6. OC中有GC垃圾回收机制吗?,iPhone上GC吗?

7.在OC中与 Alloc 语义相反的是 release 还是 dealloc?

8.什么是内存溢出?

9.内存区域分布

在iOS开发过程中,为了合理的分配有限的内存空间,将内存区域分为五个区,由低地址向高地址分类分别是:代码区、常量区、全局静态区、堆、栈。

10.堆区和栈取的区别

11.怎么保证多人开发进行内存泄露的检查.

  1. 使用Analyze进行代码的静态分析
  2. 为避免不必要的麻烦, 多人开发时尽量使用ARC
  3. 使用leaks 进行内存泄漏检测
  4. 使用一些三方工具

12.block在ARC中和MRC中的用法有什么区别,需要注意什么?

  1. 对于没有引用外部变量的Block,无论在ARC还是非ARC下,类型都是 NSGlobalBlock,这种类型的block可以理解成一种全局的block,不 需要考虑作用域问题。同时,对他进行Copy或者Retain操作也是无效的
  2. 都需要应注意避免循环引用,ARC 下使用__weak 来解决,MRC下使用__Block 来解决;

13.OC 如何对内存管理解决方法?

Objective-C的内存管理主要有三种方式 自动内存管理、手动内存管理、自动释放池。

  1. 自动内存计数
  2. 手动内存计数:
  3. 自动释放池:

14.ARC 都帮我们做了什么?

15.weak指针的实现原理

16.方法里有局部对象,出了方法后会立即释放吗

17.MRC情况下怎么做单例模式

创建单例设计模式的基本步骤 : ·

  1. 声明一个单件对象的静态实例,并初始化为nil。
  2. 创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类 的实例
  3. 实现NScopying协议, 覆盖allocWithZone:方法,确保用户在直接分配和 初始化对象时,不会产 生另一个对象。
  4. 覆盖release、autorelease、retain、retainCount方法, 以此确保单例的 状态。
  5. 在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实 例被正确的创建和初始化。

18.非OC对象如何管理内存?

19. CADisplayLink、NSTimer会出现的问题,以及解决办法?

问题:

  1. CADisplayLink、NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用
  2. CADisplayLink、NSTimer都是基于 runloop 实现的.runloop 会对 CADisplayLink、NSTimer进行强引用, CADisplayLink、NSTimer又 会对 target 进行引用,造成循环引用
// 内部使用 WeakSelf,并在视图消失前,关闭定时器
__weak __typeof(self)weakSelf = self;
NSTimer * timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
    NSLog(@"timer");
}];
self.timer= timer;
[[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
image.png
.h
// 解决循环引用问题
@interface MyProxy : NSProxy
- (instancetype)initWithObjc:(id)objc;
+ (instancetype)proxyWithObjc:(id)objc;
.m
@interface MyProxy()
@property(nonatomic,weak) id objc;
@end

@implementation MyProxy
- (instancetype)initWithObjc:(id)objc{
    self.objc = objc;
    return self;
}
+ (instancetype)proxyWithObjc:(id)objc{
    return [[self alloc] initWithObjc:objc];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [self.objc methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation *)invocation {
    if ([self.objc respondsToSelector:invocation.selector]) {
        [invocation invokeWithTarget:self.objc];
    }
}

使用方法:

NSTimer * timer = [NSTimer timerWithTimeInterval:1
                                          target:[TimerProxy proxyWithTarget:self]
                                        selector:@selector(test1)
                                        userInfo:nil
                                         repeats:YES];
self.timer = timer;
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

20.什么是Tagged Pointer?

21.copy和mutableCopy区别

image.png

22. 内存泄漏可能会出现的几种原因?

23. ARC下什么样的对象由 Autoreleasepool 管理

24. 如何实现AutoreleasePool?

25. AutoreleasePoolPage的结构?以及如何 push 和 pod 的?

image.png

26.Autoreleasepool 与 Runloop 的关系

iOS在主线程的Runloop中注册了2个Observer

27.子线程默认不会开启 Runloop,那出现 Autorelease 对象如何处理?不手动处理会内存泄漏吗?

28.以下代码会有什么问题吗?

Person *p = [[[[Person alloc]init] autorelease] autorelease];

29.以下代码运行会有是问题?

for (int i= 0; i< 1000000; i++) {
      NSString * str = [NSString stringWithFormat:@"abcdefghijklmn1234566!@#$"];
}
    
for (int i= 0; i< 1000000; i++) {
       NSString * str = [NSString stringWithFormat:@"abc!"];
 }

下一篇入口:

iOS | 面试知识整理 - 多 线 程 (六)

上一篇下一篇

猜你喜欢

热点阅读