自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 收藏
  • 关注

原创 weak与strong

先说指针的区别,先创建一个test类

2022-02-27 23:05:26 139

原创 内存管理 - 引用计数的存储源码解析

搞不懂现在为毛还问这种面试题,难怪还能开启mrc手动管理内存不成么看看源码就好了下载OBJC源码,搜索retainCount

2022-02-26 23:00:54 1936

原创 内存管理-内存分布

保留区和内核区一般系统都不会给程序员操作,就不介绍了代码段: 编译后的代码存放地,本质上程序就是运行着代码段,然后取调用其它地址的内容数据段: 本质来说就是全局区,存放着字符串常量和statiti...

2022-02-26 22:24:14 1668

原创 循环引用问题解决

正常情况下,使用一个NSTimer或者CADisplayLink这种类型的计时器,就需要停止,而不清楚什么时候停止,就得需要一个强引用的对象,而这种需要传入一个target,又需要一个强引用,那肯定会出现循环引用解决方式:创建一个中间类,把中间类传入,再用弱指针持有另一个对象,完成2强一弱就能正常释放了

2022-02-16 16:39:46 1338

原创 内存管理相关面试题 - CADisplayLink 和NSTimer

共同点:都是计时器,为了保证停止,如果用了强指针引用都会造成循环引用不同点: CADisplayLink基本不会用到,因为它无法指定时间,是随帧率来的,做游戏用处较大,应用用处没那么大

2022-02-16 16:20:13 875

原创 atomic和nonatomic

因为是区别在于线程安全所以勉强可以算作是个多线程的面试题吧atomic是原子性操作,也是所谓的线程安全nonatomic是非原子操作,本质是必须加锁才能线程安全if (!atomic) { oldValue = *slot; *slot = newValue;} else { spinlock_t& slotlock = PropertyLocks[slot]; slotlock.lock(); oldValue = *slot; *s

2022-02-13 14:43:32 994

原创 多线程系列面试题5 - 信号量是什么,有什么用处

信号量的作用是处理同一时间的最大并发量1.锁,信号量控制为1,那就是一个锁了

2022-02-12 16:44:48 413

原创 多线程系列面试题4 - 常见的锁有哪些,使用过么,简单说说

一般会在多线程里面引出锁相关的面试题,或者直接问,反正没啥区别锁的出现就是为了应付多线程的弊端,也就是多个线程访问同一个资源,最终的结果肯定会乱七八糟,如果不加锁的话常见的锁:OSSpinLock,os_unfair_lock 前者已经废弃,替换者是后者pthread_mutex pthread基本也不用NSLock,NSRecursiveLock,NSCondition,NSConditionLock 面向对象的锁,可读性是最高的@synchronized swift没有,只能用底

2022-02-12 15:58:39 787

原创 多线程系列面试题3 - 队列组

记得有一年有个面试官问过一个问题:如何实现以下功能首先完成task1,task2,这两个任务互不相干,但两个任务完成之后要通知task3去干活,然后渲染UI?要完成这个操作是肯定需要队列组的

2022-02-11 15:57:07 187

原创 多线程系列面试题2 - 线程的同步,异步,串行,并发

首先要分清楚 同步和异步是开启线程的能力区别,串行和并发指的是队列也就是开启的线程以什么方式执行首先同步sync是不能开启线程的,不管是串行队列,并发队列还是主队列都只能串行执行异步async只有在主队列执行是不能开启新线程的,因为主线程已经存在,然后在并发队列,执行并发操作,串行队列执行串行操作

2022-02-11 14:36:16 860

原创 多线程系列面试题1 - 多线程是什么,常见的有哪些

多线程技术是一种防止单一线程阻塞而产生的技术,举个例子,在IM开发中如果消息比较多,那么如果处理数据和渲染UI一起做,那卡顿就不可避免了,而使用多线程,创建个子线程去处理数据,就完全可以解决这个问题常用的多线程开发技术有

2022-02-10 16:29:38 466

原创 RunLoop系列面试题- 3.RunLoop的具体流程

RunLoop的具体流程或者说_source0,_source1,_observer,_timer都干了些什么source0: 主要负责触摸事件,performSelector等等source1: 线程间通讯,系统事件捕获(比如屏幕点击等等)observer: RunLoop的状态变化,和UI刷新(休眠之前),autorelease(休眠之前)timer: NSTimer里面的操作,延时函数要想知道流程,首先就得找到源码的入口import UIKitclass ViewCont

2022-02-10 13:01:29 968

原创 RunLoop系列面试题- 2.RunLoop的基本结构

RunLoop的底层源码:Source Browser然后找到CFRunLoop.h和CFRunLoop.c这两个文件就是RunLoop的底层源码了

2022-02-09 11:11:27 516

原创 RunLoop系列面试题- 1.什么是RunLoop,Runloop和线程的关系

RunLoop基本介绍RunLoop翻译过来就是运行循环,就是保证程序运行的,本质就是个循环,它的目的本质就是为了保活,保护线程的活跃,能处理事件,NSTimer定时器,等等不方便在顺序程序中完成的操作,而它又不同于普通的循环,因为它会休眠,相较于普通循环,它不会不停的占用着cpu gpu资源不放

2022-02-06 13:58:39 1014

原创 runtime - 面试题系列4 - Runtime是什么,项目中用过么

这个问题要么不问,要么肯定是需要你回答用过首先Runtime是一种运行时编程技术,所谓运行时编程就是在程序运行过程中动态的增删改查一些类,属性,变量等等,比如KVO就是一种运行时技术,他在添加监听的时候动态的创建了一个类,后面的设置会通过新类重写的set方法进行...

2022-02-05 16:04:04 574

原创 Runtime - 常用的runtime API介绍

其实也不咋常用,毕竟用runtime都少#import <objc/runtime.h> 使用runtime之前一定要导入这个Class object_getClass(id obj)

2022-02-05 12:38:45 790

原创 runtime - 面试题系列3 - [super viewDidLoad]

id cls = [Person class];void *obj = &cls;[(__bridge id)obj print];

2022-02-04 13:43:06 676

原创 runtime - 面试题系列2 - isKindOf 和isMemberOf,isSubclassOf

这两者直接看源码就好了,在NSObject.mm这个文件里面

2022-02-03 12:31:46 276

原创 runtime - 面试题系列1 - Super

1.Super@interface Person : NSObject@end@interface Student : Person@end@implementation Student-(instancetype)init{ if (self = [super init]) { NSLog(@"%@",[self class]); NSLog(@"%

2022-02-03 11:45:33 784

原创 runtime typeencoding

TypeEncoding-(void)test:(int)num{ NSLog(@"%d",num);}-(NSString *)test1:(NSString *)name{ return name;}这样一个test的typeencoding是个啥,创建一个Person,里面创建个test,test1函数#import &

2021-12-15 13:58:28 1215

原创 runtime - 消息机制

消息机制是我见过runtime里面最常见的面试题,几乎问到runtime,必问消息机制换句话说就是[self test]; 这个函数调用,是怎么找到底层函数列表的test函数,首先这段代码的底层是c++转成C++调用的大约是objc_msgSend(self,sel_registerName(test))这种形式,所以第一步:消息发送阶段objc_msgSend(self,sel_registerName(test)),给对应的类发送发送消息,前面的是类,后面的是函数最终结果是一个SEL,所以转

2021-11-19 18:27:09 1376

原创 Runtime - isa 类的具体结构

1.runtime的作用

2021-11-10 18:03:31 1800

原创 OC面试题 - block相关汇总

block出现之后除了官方原有,几乎很少人再用delegate模式了,很多api也扩展了block模式,block最常见的面试分为:1.block的基本使用方式2.block的原理,本质上block是个啥3.衍生出来的循环引用问题产生的原因以及解决方式4.__block和__weak的区别5.block捕获机制...

2021-11-02 18:26:44 311

原创 OC面试题 - 给类添加个属性

#import <Foundation/Foundation.h>@interface NSObject (Test)@property (nonatomic,strong)NSString *name;@end#import <Foundation/Foundation.h>#import "NSObject+Test.h"int main() { NSObject *OBJ = [[NSObject alloc] init]; OBJ.name .

2021-10-28 18:15:52 217

原创 OC面试题 - load与initialize

load在加载这个类的时候就会调用,拿程序启动来说就是在启动的时候会调用,所以没必要的代码不要写load里面,会降低启动速度,并不需要任何地方调用这个类,这个函数就会执行initialize则需要初始化才会调用,优先级要高于init函数,就是重写init函数,也会发现这个调用之后init才会执行...

2021-10-26 20:51:09 87

原创 OC面试题 - 分类(Category)与类拓展(extension)

分类和类拓展的区别是很多面试官喜欢问的,本人也被问过好几次相同点:两者都是在一个类上面拓展属性或者方法不通点:1.分类本身不会创建一个存储属性,只会调用set get,这本身是没用的,要添加一个真正能存储值得属性,需要Runtime的关联对象,或者用其它的全局值来代替2.加载方式,extension只能说把.h的内容写到了.m里面,加载方式和写在.h并没有区别,而分类则是编译的时候利用循环把原有的方法添加到类对应的地方(值得注意的是,如果同名会覆盖掉原来的函数,因为插入步骤很复杂,但最终结果是分

2021-10-22 18:42:33 159

原创 OC面试题- kvc和KVO的区别,及其本质

1

2021-10-20 18:06:54 353

原创 OC面试题- isa,Superclass,类的基本结构

首先类的本质是C++的struct类的内存结构OC对象细分为三类,实例对象(Instance),类对象(Class),元类对象(Meta-Class)结构图如上isa这里才能好好的回答下isa,实例对象的isa指向类对象,类对象的isa指向元类对象,而元类对象的isa指向根元类(一般来说就是NSObject的元类)SuperclassSuperclass,这也是个指针,指向父类的指针,类对象就是指向父类的类对象,元类对象就是指向父类的元类对象,值得一提的是,所有的Supe..

2021-10-19 20:26:15 819

原创 OC面试题-一个类占多少字节

#import <Foundation/Foundation.h>#import <objc/runtime.h>#import <malloc/malloc.h>@interface Person:NSObject{ @public int _age;}@end@implementation Person@end@interface Student: Person{ @public int _no.

2021-10-15 16:06:21 249

原创 Swift源码简单解读 - == 与 ??

====的定义地方有很多,也不能所有地方都进行解读,解读几个常见的吧==在array中的定义@inlinable public static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool { let lhsCount = lhs.count if lhsCount != rhs.count { return false } // Test ref

2021-09-28 16:37:24 150

原创 Swift源码简单解读-Map与FlatMap

Swiftswift源码里面这四个是经常看的,

2021-09-26 16:47:31 350

原创 RxSwift 响应式编程

响应式编程已经出了很完整的框架了比如ReactiveCocoa 简称RAC,前段时间有个项目是这个框架(感觉贼鸡儿晦涩难懂,完全把编程思路要整个转换,如果之前不是用这个编程范式),ReactiveCocoa是专门针对的OC Swift,换句话说暂时来说是适配苹果各平台开发(iOS,Mac)再比如ReactiveX,这个这个版本支持的语言就更多了,也不是很重要,就不细较了,唯一值得在意的是RXSwiftuse_frameworks!target 'UItest' do pod 'RxSwi

2021-09-18 15:12:25 396

原创 面向协议编程

面向对象 OOP 面向协议POP是Swift的一种编程范式,官方API和一些第三方库用的挺多的,即使不用这种范式,也有了解的必要面向协议编程比OC的协议要更加强大,除了使用组件开发的时候遵循某些方法外,还可以给某些有共同但...

2021-09-17 12:30:21 169

原创 Swift 判断字符串有多少汉字

let str = "abc积分换地方叫对方吧由11234"func hanziCount(str: String) -> Int { var count = 0 for index in str.indices { if ("\u{4E00}" <= str[index] && str[index] <= "\u{9FA5}") { count += 1 } } return c.

2021-09-15 14:10:49 336

原创 Swift - 函数式编程

函数式编程并不是一门技术,严格来说算是一种代码规范,函数式编程的核心就是把代码的可复用性提高,减少代码量(我个人觉得没必要复用性太严重,否则会出A CALL B B CALL C,然后C里面又CALL了N个函数,这N个函数在N个类里面还有重名,可读性基本没有,适当的降低代码量即可)...

2021-09-14 16:25:52 102

原创 集合-高阶函数

数组数组本身的增删改查就不赘述var arr = [1,2,3,4]arr.append(5) //在最后面插入arr.popLast() //弹出最后一个元素arr.insert(6, at: 3) //插入arr.remove(at: 1) // 删print(arr.index(after: 1)) //查map

2021-06-15 17:27:38 88

原创 多线程- 1 基本用法

基本用法多线程的最常见的目的就是1.把耗时的计算操作放到子线程2.通知主线程渲染UI区别只在于是串行队列和并行队列,比如

2021-06-08 18:40:52 77

原创 类拓展添加一个存储属性

在OC里面分类也是无法添加一个属性的,可以调用set 和get方法,但实际的值是无法存储的,解决的办法就是添加关联对象在Swift里面拓展就相当于OC的分类,本身也是m

2021-05-29 16:44:59 70

原创 OC和Swift混编 补充

可以看到只有8个字节了,里面是一个指针,学过OC的应该知道这就是isa指针,指向的是类对象地址,然后里面有superClass指定和isa里面的isa指向元类对象,这都是OC的内容了就不赘述了

2021-05-28 18:07:14 114

原创 字符串处理

String和NSString是两个东西,前者是结构体,后者是对象,如果可以尽量使用结构体var str = ""var

2021-05-28 17:53:52 83

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除