likes
comments
collection
share

2021-截止9月:iOS开发新跳槽收录题目笔记

作者站长头像
站长
· 阅读数 31

1、字符串常用方法

字符串截取 NSString *strSub = [str substringFormIndex:2];

NSString *strSubT = [str substringToIndex:2];

NSString *strSubR = [str substringWithRange:range];

字符串替换

NSString *newStr = [str stringByReplacingOccurencesOfString:@"ll" withString:@"al"];

编码,把UTF8编码的字符串编码成URL中可用的字符串

url_cn = [url_cn stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

字符串转数组

NSArray *array = [str componentsSeparatedByString:@","];--分隔符

数组转字符串

NSString *str = [array componentsJoinedByString:@","];--分隔符

9、Runtime可以做什么事情

1》获取类里面的所有成员变量

2》为类动态添加成员变量

3》动态改变类的方法实现

4》为类动态添加新的方法

10、WKWebView与UIWebView的比较替换

相比于UIWebView的优势

1》在性能、稳定性、占用内存方面有很大提升

2》允许JavaScript的Nitro库加载并使用(UIWebView中限制)

3》增加加载进度实行:estimatedProgress,不用再自己写进度条了

4》支持了更多的HTML属性。

11、iOS常见加密方式

1》base64加密:基本原理是原本是8个bit一组表示数据,改为6个bit一组表示数据,不足的部分补零,每两个0用一个 = 表示;用base64编码之后,数据长度会变大,增加了大约1/3左右;可进行反向解密;编码有个非常显著的特点,末尾有个 = 号

2》MD5加密:把任意一个长度的字符串换成一定长度的十六进制的大整数

3》AES加密

4》RSA加密

12、drawRect

1》我们只能在继承了UIView的子类中通过重写drawRect方法来绘制图形

2》如果需要绘制图形的子类直接继承自UIView,则子类的drawRect中不需要调用父类方法[super drawRect:rect];。如果子类继承自其它继承UIView的view类,则drawRect方法中需要调用父类方法[super drawRect:rect];。

3》drawRect方法不能手动直接调用,我们可以通过调用其它方法来实现drawRect方法的调用。如:在子类初始化时调用- (instancetype)initWithFrame:(CGRect)frame方法,且frame不为CGRectZero时。

4》我们可以调用setNeedsDisplay()方法或setNeedsDisplayInRect方法,但是该方法不会自己调用drawRect方法,而是会标记视图,并在下一次循环更新的时候让视图通过drawRect来进行重绘,前提是rect不为CGRectZero。

13、iOS开发中的锁

1》临界区:指的是一块对公共资源进行访问的代码,并非是一种机制或者算法。

2》互斥锁:是一种用于多线程编程中,防止两条线程同时对同一个公共资源进行读写的机制,该目的通过将代码切片成一个一个的临界区而达成。

3》自旋锁:是用于多线程同步的一种锁,线程会反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显示释放自旋锁。自旋锁避免了进城上下文的调度开销,因此对于线程只会阻塞很短时间的场合是有效的。

4》读写锁:是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁,用于解决多线程对公共资源的读写问题。读操作可并发重入,写操作是互斥的。读写锁通常用互斥锁、条件变量、信号量实现。

5》信号量:是一种更高级的同步机制,互斥锁可以说是semaphore在仅取值0/1的特例。信号量可以有更多的取值空间,用来实现更加复杂的同步,而不单单是线程间互斥。

6》条件锁:就是条件变量,当进城的某些资源要求不满足时就进入休眠,也就是锁住了。当资源被分配到了,条件锁打开,进城继续运行。

14、系统对象的 copy 与 mutableCopy 方法

不管是集合类对象(NSArrayNSDictionaryNSSet ... 之类的对象),还是非集合类对象(NSString, NSNumber ... 之类的对象),接收到copy和mutableCopy消息时,都遵循以下准则:
1. copy 返回的是不可变对象(immutableObject);如果用copy返回值调用mutable对象的方法就会crash。
2. mutableCopy 返回的是可变对象(mutableObject)。

一、非集合类对象的copy与mutableCopy
  在非集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制;
  对可变对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:
    NSString *str = @"hello word!";
    NSString *strCopy = [str copy] // 指针复制,strCopy与str的地址一样
    NSMutableString *strMCopy = [str mutableCopy] // 内容复制,strMCopy与str的地址不一样

    NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"];
    NSString *strCopy = [mutableStr copy] // 内容复制
    NSMutableString *strMCopy = [mutableStr mutableCopy] // 内容复制

二、集合类对象的copy与mutableCopy (同上)
  在集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制;
  对可变对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对集合内的对象元素仍然是指针复制。(即单层内容复制)
    NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
    NSArray *copyArr = [arr copy]; // 指针复制
    NSMutableArray *mCopyArr = [arr mutableCopy]; //单层内容复制

    NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
    NSArray *copyArr = [mutableArr copy]; // 单层内容复制
    NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 单层内容复制

【总结一句话】:
    只有对不可变对象进行copy操作是指针复制(浅复制),其它情况都是内容复制(深复制)!

15、写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name

答:
// retain
- (void)setName:(NSString *)str {
  [str retain];
  [_name release];
  _name = str;
}
// copy
- (void)setName:(NSString *)str {
  id t = [str copy];
  [_name release];
  _name = t;
}

16、KVC的底层实现?

当一个对象调用setValue方法时,方法内部会做以下操作:
1). 检查是否存在相应的keyset方法,如果存在,就调用set方法。
2). 如果set方法不存在,就会查找与key相同名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。
3). 如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值。
4). 如果还没有找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

17、你是否接触过OC中的反射机制?简单聊一下概念和使用

1). class反射
    通过类名的字符串形式实例化对象。
        Class class = NSClassFromString(@"student"); 
        Student *stu = [[class alloc] init];
    将类名变为字符串。
        Class class =[Student class];
        NSString *className = NSStringFromClass(class);
2). SEL的反射
    通过方法的字符串形式实例化方法。
        SEL selector = NSSelectorFromString(@"setName");  
        [stu performSelector:selector withObject:@"Mike"];
    将方法变成字符串。
        NSStringFromSelector(@selector*(setName:));

18、调用方法有两种方式

1). 直接通过方法名来调用。[person show];
2). 间接的通过SEL数据来调用 SEL aaa = @selector(show); [person performSelector:aaa];  

iOS 实战题

AppDelegate如何瘦身? 反射是什么?可以举出几个应用场景么?(知道多少说多少) 有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少) App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少) App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少) 你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少) 你知道有哪些情况会导致app卡顿,分别可以用什么方法来避免?(知道多少说多少)

网络题

App 网络层有哪些优化策略? TCP为什么要三次握手,四次挥手? 对称加密和非对称加密的区别?分别有哪些算法的实现? HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么? HTTPS是如何实现验证身份和验证完整性的? 如何用Charles抓HTTPS的包?其中原理和流程是什么? 什么是中间人攻击?如何避免?

计算机系统题

了解编译的过程么?分为哪几个步骤? 静态链接了解么?静态库和动态库的区别? 内存的几大区域,各自的职能分别是什么? static和const有什么区别? 了解内联函数么? 什么时候会出现死锁?如何避免? 说一说你对线程安全的理解? 列举你知道的线程同步策略? 有哪几种锁?各自的原理?它们之间的区别是什么?最好可以结合使用场景来说

设计模式题

除了单例,观察者设计模式以外,还知道哪些设计模式?分别介绍一下 最喜欢哪个设计模式?为什么? iOS SDK 里面有哪些设计模式的实践? 设计模式是为了解决什么问题的? 设计模式的成员构成以及工作机制是什么? 设计模式的优缺点是什么?

架构 & 设计题

MVC和MVVM的区别?MVVM和MVP的区别? 面向对象的几个设计原则了解么?最好可以结合场景来说。 可以说几个重构的技巧么?你觉得重构适合什么时候来做? 你觉得框架和设计模式的区别是什么? 看过哪些第三方框架的源码,它们是怎么设计的?设计好的地方在哪里,不好的地方在哪里,如何改进?(这道题的后三个问题的难度已经很高了,如果不是太N的公司不建议深究)

数据结构&算法题

链表和数组的区别是什么?插入和查询的时间复杂度分别是多少? 哈希表是如何实现的?如何解决地址冲突? 排序题:冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些? 链表题:如何检测链表中是否有环?如何删除链表中等于某个值的所有节点? 数组题:如何在有序数组中找出和等于给定值的两个元素?如何合并两个有序的数组之后保持有序? 二叉树题:如何反转二叉树?如何验证两个二叉树是完全相等的?

转载自:https://juejin.cn/post/7020290363965325326
评论
请登录