2021新出iOS开发程序员学习路线,涵盖大部分iOS知识体系【不会没收藏吧!】

本文整理了iOS开发的面试知识点,涵盖了字符串操作、数组、方法延迟执行、代理、内存管理、调试技巧、数据存储、Runtime、WKWebView、加密方式等众多主题,旨在帮助iOS开发者全面了解和掌握面试必备技能。
摘要由CSDN通过智能技术生成

这个栏目将持续更新--请iOS的小伙伴关注!

整理不易,如果您觉得还不错,麻烦在文末 “点个赞” 或者 评论 “Mark”,谢谢您的支持

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:@","];--分隔符

 

字符串转字典

 

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSError *err;

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData

                                options:NSJSONReadingMutableContainers

                                                           error:&err];

字典转字符串

 

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];

内容总览:

下面我就给大家展示当下最热门的知识点内容!

 

 

·iOS面试题答案PDF文集

最新 初级iOS 面试题
最新 中级iOS 面试题
最新 高级iOS 面试题
《BAT面试资料全集》
《BAT大厂常问iOS面试题》
《2021年面试真题》
《iOS开发面试题200道-面试问答篇》
《iOS开发笔试题600道-笔试手写篇》
《iOS中级到高级面试题完整版》

2、数组

数组替换

[_dataSource replaceObjectAtIndex:1 withObject:recentArray];

数组倒序

 

NSArray *array = @[@1, @20, @3, @10, @2];//排序后到新数组里
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSNumber* obj1, NSNumber* obj2) {
 if ([obj1 intValue] > [obj2 intValue]) {
     return NSOrderedDescending;
 } else { 
     return NSOrderedAscending;
 } 
}];

3、浅谈iOS开发中方法延迟执行的集中方式

1》performSelector方法

 

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

2》NSTimer定时器

 

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

3》NSThread线程的sleep

 

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

4》GCD

 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

});

4、写一个完整的代理,包括生命、实现

 

//创建
@protocol MyDelegate
@required
-(void)eat:(NSString *)food;
@optional
-(void)run;
@end
//声明.h
@interface person:NSObject<MyDelegate>
@end
//实现.m
@implementation person
-(void)eat:(NSString *)food{
}
-(void)run{
}
@end

5、BAD_ACCESS在什么情况下出现

这种问题在开发时经常遇到,原因是访问了野指针,比如访问已经释放的对象的成员变量或者发消息、死循环等。

6、lldb(gdb)常用的控制台调试命令

1》p 输出基本类型,是打印命令,需要指定类型,是print的简写

 

p (int)[[[self view] subviews] count]

2》po 打印对象,会调用description方法,是print-object的简写

po [self view]

3》expr 可以在调试时动态执行制定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。

4》bt 打印调用堆栈,是thread backtrace的简写,加all可打印所有的thread的堆栈。

5》br l 是breakpoint list的简写。

7、你一般是怎么用Instruments的?

Instruments里面工具很多,常用的有:

1》Time Profiler:性能分析

2》Zoombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能

3》Allocations:用来检查内存,写算法的那批人也用这个来检查

4》Leaks:检查内存,看是否有内存泄漏

8、iOS常用的数据存储方式有哪些?

 

数据存储有四种方案:NSUserDefault、KeyChain、file、DB。 
其中File有三种方式:plist、Archive(归档)
DB包括:SQLite、FMDB、CoreData

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 方法

 

不管是集合类对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值