面试[
harkecho
这个作者很懒,什么都没留下…
展开
-
OC中的block
Block是将(函数)及其(执行上下文)封装起来的(对象)// MCBlock.m- (void)method{ int multiplier = 6; int (^Block)(int) = ^int(int num) { return num * multiplier; }; Block(2);}源码解析,使用 clang -rewrite-objc file.m 命令查看编译之后的文件内容结构体构造函数中第一个参数是函数指针,第二个参数block的描述,第三个参数是blo.原创 2020-09-02 10:55:56 · 426 阅读 · 0 评论 -
iOS内存管理方案
不同场景下的内存管理方案:1 小对象采用TaggedPointer2 Arm64架构下的iOS应用程序采用的是NONPOINTER_ISA(本身占64bit位,实际上32位就够用了,剩余的苹果为了提高内存的利用率,剩余位存储了内存管理相关的内容)第一位如果是0代表isa只是存isa指针的,如果是1代表是优化过的,第2位表示当前对象是否有关联对象has_assoc,第三位has_cxx_dtor表示当前变量是否用到c++代码或者c++一些内容,第4位到第32位(也就是33位)是当前对象的类对象的指针地址原创 2020-09-01 23:08:51 · 411 阅读 · 0 评论 -
autorelease pool
原创 2020-08-27 15:51:55 · 113 阅读 · 0 评论 -
iOS应用程序生命周期
应用程序的状态Not running 未运行,程序没有启动Inactive 未激活, 程序在前台运行,不过没有接收到事件,在没有事件处理 情况下,程序通常停留在这个状态Active 激活 程序在前台运行而且接收到了事件,Background 后台 程序在后台而且能执行代码,大多数程序进入这个状态会停留一会,之后会进入挂起suspended,Suspended 挂起 程序在后台不能执行代码,系统会自动把程序变成这个状态而且不会发出通知当挂起时,程序还是停留在内存中,当系统内存低时,系统就把挂...原创 2020-08-27 15:50:11 · 118 阅读 · 0 评论 -
常用web图片格式:gif、jpg、png、webp
1.GIF(87年):使用无损压缩,支持256中颜色(一般叫8 bit彩色),支持单一透明色;2.JPG(92年):使用的一种失真压缩标准方法,24 bit真彩色,内容比GIF丰富,不支持动画、不支持透明色。JPEG的压缩方式通常是破坏性资料压缩(lossy compression),意即在压缩过程中图像的品质会遭受到可见的破坏。一张图片多次上传下载后,图片逐渐会失真。 优点 JPEG/JFIF是最普遍在万维网(World Wide Web)上被用来储存和传输照片的格式。JPEG在色调及颜色平滑变化的原创 2020-08-23 21:12:50 · 8928 阅读 · 0 评论 -
ETag
ETagHTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖(“空中碰撞”)。如果给定URL中的资源更改,则一定要生成新的Etag值。 因此Etags类似于指纹,也可能被某些服务器用于跟踪。 比较etags能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。缓存一、概述缓存通俗点讲,就是将已经得到的‘东东’存放在一个相对于自己而言,尽可能近的地方,以便下次原创 2020-08-23 20:56:50 · 872 阅读 · 0 评论 -
iOS14 隐私适配及部分解决方案
简介: 在刚刚结束的线上 WWDC 2020 发布会上苹果向我们展示了新的 iOS14 系统。iOS14 的适配,很重要的一环就集中在用户隐私和安全方面。 最近在调研 iOS14的适配方案,本文主要分享一下 iOS14 上对于隐私授权的变更和部分适配方案,欢迎补充指正。在 iOS13 及以前,当用户首次访问应用程序时,会被要求开放大量权限,比如相册、定位、联系人,实际上该应用可能仅仅需要一个选择图片功能,却被要求开放整个照片库的权限,这确实是不合理的。对于相册,在 iOS14 中引入了 “Limited.原创 2020-08-23 20:27:16 · 2225 阅读 · 0 评论 -
AFNetworking(AFURLSessionManager)
AFNetworking2.0和3.0有什么区别?2.0使用的NSURLConnection,3.0使用的是NSURLSession那么NSURLSesstion和NSURLConnection有什么区别:1、下载任务时:NSURLConnection会先放在内存、最后写入沙盒。可能引起内存暴涨。NSURLSession会直接写在沙盒和tem文件夹中、最后需要手动转移。2、请求控制:NSURLConnection创建好了对象、便开始网络请求。只能cancel并不能恢复。NSURLSess原创 2020-08-23 19:23:23 · 426 阅读 · 0 评论 -
iOS的NSObject *, id和instancetype
用id修饰和NSObject *修饰有何不同?OC中的动态类型和静态类型动态类型动态类型指的是对象指针类型的动态性,具体指使用id修饰后将对象的类型确定推迟到运行时,由赋给它的对象类型决定对象指针的类型,也就是说id修饰的对象为动态类型对象,其他在编译器指明类型的为静态类型对象,通常如果不需要涉及到多态的话,还是尽量使用静态类型(原因:错误可以在编译器提前查出,可读性好).// 动态类型id obj = [[TestObject alloc] init]静态类型一个指针变原创 2020-08-23 18:34:02 · 236 阅读 · 0 评论 -
2020 TOP100面试算法题
原创 2020-06-20 18:52:52 · 654 阅读 · 0 评论 -
微博面试问题总结
1 崩溃程序入口怎么找loadAddressBugly如何知道此时已经崩溃了2 bundle icon加载的时候是分段载入内存,那么具体载入多少4 掉帧检测以及如何处理的5 sdwebImageDownloader如何做的串行请求某个图片资源结束后再请求下一个首先代码6 谁发起的屏幕刷新操作 VSync7 检测在子线程里做了UI操作 (待续)原因及解决这是Xcode 9以后的新特性:主线程检测器(Main Thread Checker);1.检查代码出现的时候意味着本来需要在主原创 2020-06-03 05:31:01 · 1009 阅读 · 0 评论 -
HTTP1.0,HTTP1.1 HTTP2主要区别
HTTP1.0 HTTP1.1主要区别长连接HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。断点续传的基础HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。HOST原创 2020-06-02 19:03:01 · 183 阅读 · 0 评论 -
DispatchGroup
一、DispatchGroup三种用法:1.notify(依赖任务) func testNotify() { let group = DispatchGroup() let myQueue = DispatchQueue(label: "com.aa") myQueue.async(group: group, qos: .default, flags: []) { for _ in 0...10 {原创 2020-06-02 16:24:22 · 373 阅读 · 0 评论 -
计算app启动时间(OC&Swift)
App启动时间,直接影响用户对app的第一体验和判断.如果启动时间过长,不单用户体验会下降, 还有可能会触发苹果的watch dog机制而kill掉App, 所以App启动时间优化也十分重要启动时间分为两部分一: main函数执行之前的加载时间主要是系统的动态链接库和可执行文件的加载时间二: main函数开始到 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOpt原创 2020-05-29 08:19:27 · 1015 阅读 · 0 评论 -
iOS应用内支付(IAP)
内购接口有是否允许充值创建订单票价发给服务器查询余额let bodyParams: [String: Any] = bodyParamslet paramKeys = [“userId”,“payType”,“productId”]let paramValues = [bodyParams[“UserId”] as! String,"(bodyParams[“PayType”]!)",bodyParams[“ProductId”] as! String]1 IAP流程IAP流程分为两种,一原创 2020-05-27 18:30:53 · 1194 阅读 · 0 评论 -
UIWebView与WKWebVie的区别
UIWebView使用UIKit框架WKWebView使用WebKit.frameworkWKWebView性能比UIWebView多两倍WKWebView呈现大约8500个对象,UIWebView呈现大学3500个对象CPU使用率的百分比说明了实际性能,WKWebView使用25%的CPU呈现相同数量的粒子,而UIWebView使用90%的CPU用于同一任务。UIWebView只加载一次,并将数据保存到Cookie中,以便下次加载时间与以前相比减少,而在WKWebView中,不会保存Cooki原创 2020-05-27 16:59:41 · 2779 阅读 · 0 评论 -
nil, Nil, NULL, NSNull的区别
nil:指向一个对象的空指针,对Objective-C 的id对象附控制nil在指向一个对象的指针为空,定义如下#ifndef nil# if __has_feature(cxx_nullptr)# define nil nullptr# else# define nil __DARWIN_NULL# endif#endif在Objective-C中用于id类型的对象NSString *str = nil;NSURL *url = nil;id object = nil原创 2020-05-27 16:58:47 · 167 阅读 · 0 评论 -
空指针,野指针,悬挂指针
当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针)某些编程语言允许未初始化的指针的存在,而这类指针即为野指针。悬垂指针的成因:在许多编程语言中(比如C),显示地从内存中删除一个对象或者返回时通过销毁栈帧,并不会改变相关的指针的值。该指针仍旧指向内存中相同的位置,即使引用已经被删除,现在可能已经挪作他用。一个简单的例子:{ char *dp = NULL; /* ... */ {原创 2020-05-27 15:55:52 · 806 阅读 · 0 评论 -
UIView的生命周期
接上次VC的生命周期XibView的加载过程//CodeVC代码#import "CodeInitViewController.h"#import "XibInitViewController.h"#import "CodeView.h"#import "XibView.h"@interface CodeInitViewController ()@end@implementation CodeInitViewController+ (void)load { [super原创 2020-05-27 06:55:41 · 414 阅读 · 0 评论 -
找到第一个不重复的字符(Bd interview)
方法一 public static void searchRepeat(char[] character) { List<Character> list = new ArrayList<>(); for (int i = 0; i < character.length - 1; i++) { int count = 0; for (int j = 0; j < character.len原创 2020-05-26 21:08:11 · 108 阅读 · 0 评论 -
VC生命周期(Bd interview)
通过三个VC,第1个VC是storyBoard创建的,第2个VC是纯code创建的,第3个是xib创建的。分别称为BoardViewController、CodeInitViewController、XibViewController,这三个控制器采用导航模式进行交互,现在在VC中把所有跟初始化相关的方法都实现一下并做打印,如下:程序启动,加载storyBoard实例化ViewController// BoardVC+ (void)load { [super load]; NSLog原创 2020-05-26 19:02:58 · 453 阅读 · 0 评论 -
block传如字段拼接字符串返回(Bd interview)
OC写法 NSDictionary *dic = @{@"1":@"abc",@"2":@"234"}; NSString *(^MHBlock)(NSDictionary *) = ^(NSDictionary * dic) { NSArray *keys = dic.allKeys; NSMutableArray *valueArray = [NSMutableArray array]; for (NSString *ite原创 2020-05-26 17:19:47 · 165 阅读 · 0 评论 -
假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
- (void) deleteSomeCharacter { NSMutableString *str = [NSMutableString stringWithString:@"aabcab"]; for (int i = 0; i < str.length - 1; i++) { for (int j = 0; j < str.length; j++) { unsigned char a = [str chara原创 2020-05-26 11:13:03 · 759 阅读 · 1 评论 -
XOR 异或
相同为0, 不同为1异或操作的一些特点x^0 = xx^1s(指二进制全位1的数) = ~x 相等于给x进行取反x^(~x)=1sx^x = 0a^b =c => a ^ c = a ^ a ^ b = b, b ^ c = b ^ a ^ b = a // swap实战常用的位运算操作X & 1 == 1 OR == 0 判断X最后一个二进制位是1还是0 奇偶性(X % 2 == 1)X = X & (X - 1) => 清零最低位的1X &.原创 2020-05-20 13:22:56 · 389 阅读 · 0 评论 -
IM设计模块思想
首先是IM和API, 用httpAPI来请求用户的好友列表,群组信息, 历史记录,拉黑,建群, 踢员等IM主要做消息的接收和发送在IM中可以分为(客服端发送消息给服务器)1 用户界面UI层2 数据组装(将用户输入的message, 组装为统一标准格式发送人,接收人,发送内容的类型(图片,文字,语言,视频))等.3 编码(就是根据数据组装的结果将其按照私有协议编码,比如一个字节中某个位表示内容的类型,某个位表示你app的表示等)4 经过编码后调用socket的TCP进行发送客户端接收服务器消息原创 2020-05-20 12:16:01 · 600 阅读 · 0 评论 -
客户端整体框架模块
时长统计模块设计原创 2020-05-20 12:03:45 · 169 阅读 · 0 评论 -
设计图片缓存框架
Manager包含两部分 Cache, Downloader原创 2020-05-20 11:05:02 · 232 阅读 · 0 评论 -
设计模式的六大原则
单一原则: UIView负责处理响应,CALayer负责展示层里氏替换原则:父类被子类无缝替换,且原有功能不受任何影响 (KVO)开闭原则:对扩展开发,对修改关闭接口隔离原则:使用多个专门的协议,而不是庞大臃肿的协议 UITableViewDelegate(回调代理事件), UITableViewDatasourse(tableview的数据源)依赖倒置原则:抽象不依赖于具体,具体依赖于抽象迪米特法则:一个对象应当对其他对象有尽可能少的了解(高内聚,低耦合)责任链模式构成:某一对象或者类有.原创 2020-05-20 10:48:54 · 107 阅读 · 0 评论 -
位1的个数
示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。力扣191 int num = 7; // 101 int count = 0; while (num != 0) { if ((num & 1) == 1) { count++; } .原创 2020-05-18 23:59:17 · 297 阅读 · 0 评论 -
手撕单例
@interface MHFInstance:NSObject+(instancetype)shareInstance;@end@implementation MHFInstance+(instancetype)shareInstance{ static MHFInstance * instance = NULL; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[super a原创 2020-05-18 22:53:17 · 134 阅读 · 0 评论 -
copyWithZone
NSObject类提供了两个用于拷贝的方法:- (id)copy 和- (id)mutableCopy,这两个方法都可以复制已有对象的副本。由于oc中几乎所有的类都继承自根类NSObject,所以类中都有copy和mutableCopy两个方法,那么是否就意味着拥有这两个方法的对象可以直接调用这两个方法进行拷贝了呢?我们先定义一个Mobile类继承自NSObject 进行测试,代码如下: Mobile *mobile = [[Mobile alloc] init]; Mobile *mobile1 =原创 2020-05-18 21:38:12 · 405 阅读 · 0 评论 -
ARC下 Dealloc常见错误及其使用
Dealloc怎么写(dealloc的方法实现建议放的位置)推荐的代码组织方式是将dealloc方法放在实现文件的最前面(直接在@synthesize以及@dynamic之后)顺便提一下,@synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法,当然定义一个属性的时候,系统会默认编写了,而 @dynamic 的用法则相反,属性的 setter 与 getter 方法由用户自己实现,不自动生成。在dealloc方法中通常需要做的原创 2020-05-16 13:23:31 · 1337 阅读 · 0 评论 -
NSTimer循环引用的解决方案
在使用NSTimer,如果使用不得当特别会引起循环引用,造成内存泄露。下面我提出几种解决NSTimer的几种循环引用产生原因当你在ViewController(简称VC)中使用timer属性,由于VC强引用timer,timer的target又是VC造成循环引用。当你在VC的dealloc方法中销毁timer,发现VC被pop,VC的dealloc方法没走,VC在等timer释放才走dealloc,timer释放在dealloc中,所以引起循环引用。解决方案在ViewController执行d原创 2020-05-16 10:46:39 · 496 阅读 · 0 评论 -
runtime用途
NSMutableArray *array = @[@1, @2];[array addObject:@"234"];// 降低unrecongnized selector崩溃率实现方法签名给NSObject写一个分类- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{ // 本来能调用的方法 if ([self respondsToSelector:aSelector]) { ret原创 2020-05-15 14:18:42 · 316 阅读 · 0 评论 -
OC中super调用
//FYPPerson.h@interface FYPPerson : NSObject-(void)run;@end//FYPPerson.m#import "FYPPerson.h"@implementation FYPPerson-(void)run{ NSLog(@"run -----");}@end//FYPStudent.h#import "FYPPerson.h"@interface FYPStudent : FYPPerson@end//FYPSt原创 2020-05-15 14:08:35 · 237 阅读 · 0 评论 -
OC消息机制(objc_msgSend执行流程)
objc_msgSend的执行流程可以分为3大阶段消息发送首先判断receiver消息接收者是否为nil如果为nil退出,如果不为nil,receiver通过isa指针找到receiverClass(消息接收者的类对象,如果消息接收者本来就是类对象,那就找到的是它的元类对象), 从receiverClass(自己类对象)的cache中查找方法,找到方法调用结束,如果当前类对象没有找到方法,就从receiverClass(当前类对象的)class_rw_t(方法列表)中查找方法(如果已经排好序,用二分查找原创 2020-05-15 13:06:55 · 457 阅读 · 0 评论 -
结构体method_t,指针SEL,指针IMP的理解
SEL每个SEL类型数据都是一个方法。SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。注意:这个过程是有缓存的,第一次找SEL对应的方法是逐条找,比较耗性能,但是找过一次之后,便会留下缓存数据,再找就直接访问缓存了。例如,声明方法:@interface Person : NSObject+ (void)te原创 2020-05-15 09:20:58 · 454 阅读 · 0 评论 -
为什么要手动创建autoreleasepool
autorelase的本质就是延迟调用release方法NSThread和NSOperationQueue开辟子线程需要手动创建autoreleasepool,GCD开辟子线程不需要手动创建autoreleasepool,因为GCD的每个队列都会自行创建autoreleasepool用@autoreleasepool是有用的。正常情况下,你创建的变量会在超出其作用域的时候被释放掉。而如果你的函数写的很长,在你函数运行过程中出现很多中间变量,占据了大量的内存,怎么办?用@autoreleasepoo原创 2020-05-15 08:22:02 · 511 阅读 · 0 评论 -
js与Native交互面试问题
js交互的时候messageHander是怎么注入到js中的,如何理解上下文,可以传哪些数据结构,异步回调,原生弹出的alert中的文字,js如何获取JAVA动态注入JS以上需要注意的是,由于message的body只能是 NSNumber, NSString, NSDate, NSArray, NSDictionary, NSNull这几种类型,可以看下图苹果官方注释,所以我们无法将js函数直接传给原生,在需要进行回调的环境下,我们要将js回调函数转成String后再传给原生,再由原生获取后进行相关回原创 2020-05-14 21:23:54 · 629 阅读 · 0 评论 -
事务
什么是事务事务是指程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则,在每一个操作中所作的所有更改都会被撤销,可理解为,就是把多件事件当做一件事情来处理.事务的四个特性(ACID)原子性(atomicity):操作这些指令时,要么全部执行成功,要么全部不执行,只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态一致性(consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定隔离性(isolation):隔原创 2020-05-12 18:51:05 · 154 阅读 · 0 评论