自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 问答 (1)
  • 收藏
  • 关注

原创 【iOS】—— 循环引用问题总结

对象A和对象B,相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减1,这就导致了A的销毁依赖于B的销毁,同样B的销毁依赖于A的销毁,这样就造成了循环引用问题。

2023-08-03 19:15:09 955

原创 【iOS】—— 离屏渲染

当前屏幕渲染不需要额外创建新的缓存,也不需要开启新的上下文,相对于离屏渲染性能更好。但是受当前屏幕渲染的局限因素限制(只有自身上下文、屏幕缓存有限等),当前屏幕渲染有些情况下的渲染解决不了的,就使用到离屏渲染。而且产生的位图缓存的大小是有限制的,一般是2.5个屏幕尺寸。所以我们要根据使用场景而定。苹果系统不能够一次的去处理视图,需要一张一张的去处理视图,那么就会需要开辟一个离屏缓存区去存储一张张处理好的视图,开辟的这个离屏缓存区就会导致离屏渲染。指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区进行。

2023-08-01 15:03:55 1850

原创 【iOS】—— APP启动流程

main函数执行后的阶段,指的是:从 main 函数执行开始,到 appDelegate 的 didFinishLaunchingWithOptions方法里首屏渲染相关方法执行完成。即,从main函数执行到设置self.window.rootViewController执行完成的阶段。热启动:启动时,App的进程还在系统里,不需要开启新进程。冷启动:启动时,App的进程不在系统里,需要开启新进程。又分为几种不同的类型。内执行首屏渲染后的所有方法执行。这个阶段,首屏已经渲染完成。

2023-08-01 10:16:34 1108

原创 【iOS】—— UIKit相关问题

prepare方法被自动调用,以保证layout实例的正确。

2023-07-31 10:11:07 1452

原创 【iOS】—— 持久化

序列化:把对象转化为字节序列的过程反序列化:把字节序列恢复成对象作用:把对象写到文件或者数据库中,并且读取出来。

2023-07-26 20:54:41 1166

原创 【iOS】—— RunLoop和多线程相关问题总结

RunLoop 的基本作用:保持程序的持续运行,节省 CPU 的资源,提高程序的性能 ( 没有事情,就请休眠,不要功耗。有事情,就处理)。简单举个例子,如果用Xcode的Command Line Tool文件来写OC,在代码里创建一个NSTimer,它并不能正常运行,因为这个程序和APP不同,程序运行一次直接结束,这时候我们需要把Runloop给Run起来,NSTimer就能用了。

2023-07-25 10:52:25 1251

原创 【iOS】—— block,KVC,KVO,Category等问题解答

block一旦没有进行copy操作,就不会在堆上。MRC 下 block 如果没有 copy 到堆上,值捕获不会对外部变量引用。虽然 ARC 环境 strong 也可以修饰 Block,那是因为编译器会对 strong 修饰的 block 也会进行一次 copy 操作。使用注意:循环引用问题循环引用及强弱共舞可以看看之前的博客,上面有链接主要用了,修改了观察者的类信息,并且hooksetter方法,当setter方法调用时发送消息给所有观察者。

2023-07-20 17:26:34 509

原创 【iOS】—— 属性关键字及weak关键字底层原理

使用宏和常量所占用的内存差别不大,宏定义的是常量,常量都放在常量区,只会生成一份内存编译时刻:宏是预编译(编译之前处理),const是编译阶段。导致使用宏定义过多的话,随着工程越来越大,编译速度会越来越慢宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。宏能定义一些函数,方法。const不能。1.通过计算对象地址的哈希值, 来从SideTables中获取对应的SideTable. 哈希值重复的对象的引用计数存储在同一个SideTable里.2.SideTable使用。

2023-07-18 15:51:19 1673

原创 【iOS】—— 面向对象,Runtime,ARC等问题总结

OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动 态性相关的函数平时编写的OC代码,底层都是转换成了Runtime API进行调用。

2023-07-17 15:01:12 1091

原创 【iOS】—— 编译链接

这个过程就是把上面的main.i文件进行:词法分析、语法分析、静态分析,优化生成相应的汇编代码,最终生成。预编译是要处理源代码中以#开头的所有预编译指令。作为编译的第一步,首先将。这个过程就是把上面得到的。AST(抽象语法树)

2023-07-14 19:48:52 1312

原创 【iOS】—— swift基础语法及一些第三方库使用

这块有个强制类型转化,这块原因是因为Swift是一个非常安全的语言,所以类型必须是相同的SIZE_WIDTH是一个浮点型常量,i是一个Int型变量,所以类型不同不能一起计算。有了oc的基础,关于swift的学习比较容易,可以找一些项目练练手更好入手。跟常量一样,在使用之前必须给他赋值,否则编译器会报错。它的值不要求在编译时期确定,但使用之前必须赋值一次。这个第三方库和Masonry的作用和用法都很相似。其中这块我们看到和oc不同的是。

2023-06-08 20:06:15 1525 1

原创 【iOS】—— nil、Nil、NULL和NSNull学习

NULLnilNil这三者对于Objective-C中值是一样的,都是(void *)0。NULL是宏,是对于C语言指针而使用的,表示空指针。nil是宏,是对于Objective-C中的对象而使用的,表示对象为空。Nil是宏,是对于Objective-C中的类而使用的,表示类指向空。NSNull是类类型,是用于表示空的占位对象,与JS或者服务端的null类似的含意。

2023-06-03 21:28:40 636

原创 【iOS】—— Tagged Pointer对象

指针也是64 位,实际作为指针部分只用到的其中33位,剩余的 31位苹果使用了类似 Tagged Pointer 的概念,其中 19 位将保存对象的引1用计数,这样对引用计数的操作只需要修改这个指针即可。Tagged Pointer 的引入也带来了问题,即 Tagged Pointer 并不是真正的对象,而是一个伪对象,所以你如果完全把它当成对象来使用,可能会让它“露马脚”。的普通变量,那么它所占用的内存是与CPU的位数有关,在32位CPU下占4个字节,在64位CPU下是占8个字节的。

2023-05-28 03:54:50 1106

原创 【iOS】—— iOS中的相关锁

OSSpinLock不再安全,底层用os_unfair_lock替代atomic只能保证setter、getter时线程安全,所以更多的使用nonatomic来修饰读写锁更多使用栅栏函数来实现@synchronized在底层维护了一个哈希链表进行data的存储,使用recursive_mutex_t进行加锁NSLock、NSRecursiveLock、NSCondition和NSConditionLock底层都是对pthread_mutex的封装。

2023-05-24 17:31:11 1165

原创 【iOS】—— 实现WebSocket发送消息(SocketRocket第三方库的使用和解析)

偶然之间了解到了利用WebSocket实现后端和前端的相互发送消息,就查了查在iOS里这个东西该怎么写,用舍友写的接口简单实现了两个用户的通信。

2023-05-11 16:31:20 2799

原创 【iOS】—— NSProxy类

Class isa;苹果官方文档:NSProxy 是一个抽象基类,它为一些表现的像是其它对象替身或者并不存在的对象定义API。一般的,发送给代理的消息被转发给一个真实的对象或者代理本身引起加载(或者将本身转换成)一个真实的对象。NSProxy的基类可以被用来透明的转发消息或者耗费巨大的对象的lazy 初始化。NSProxyNSObject寻找方法顺序:本类 -> 父类 -> 动态方法解析 -> 备用对象 -> 消息转发;NSproxy寻找方法顺序:本类 -> 消息转发;

2023-05-09 17:23:10 830

原创 【iOS】—— 通知模式和代理模式

接收通知的类注册监听者并实现接收通知的事件函数触发通知的类在适当的时候发送通知KVO/通知 -------> 观察者模式KVC --------> KVC模式单例模式代理模式效率:代理比通知高;delegate是强关联,委托和代理双方互相知道。通知是弱关联,不需要知道是谁发,也不需要知道是谁接收。代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成。通知是全局通知。代理要实现对多个类发出消息可以通过将代理者添加入集合类后遍历,或通过消息转发来实现。

2023-05-08 04:00:00 718

原创 【iOS】—— RunLoop线程常驻和线程保活

我们必须保证线程不消亡,才可以在后台接受时间处理,所以如果没有实现添加NSPort或者NSTimer,会发现执行完run方法,线程就会消亡,后续再执行touchbegan方法无效。实现了上面三个方法之一,就可以发现执行完了run方法,这个时候再点击屏幕,可以不断执行test方法,因为线程self.thread一直常驻后台,等待事件加入其中,然后执行。而我们有时会需要经常在一个子线程中执行任务,频繁的创建和销毁线程就会造成资源浪费,这时候就要用到RunLoop来使线程长时间存活了。

2023-05-07 13:50:24 1512

原创 【iOS】—— RunLoop初学

简单的说 RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。在App运行的过程中,主线程的Runloop保证了主线程不被销毁从而保证应用的存活,从而能实时接收到用户的响应事件,能够触发定时事件。如果没有Runloop的话,程序执行完代码就会立马return。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode itemRunLoop也可以被监听,被监听的对象是observer对象,也属于。

2023-05-06 13:52:04 752

原创 【iOS】—— KVO再学习

主要用了,修改了观察者的类信息,并且hooksetter方法,当setter方法调用时发送消息给所有观察者由上面源码可以看出对观察者、被观察者的引用都是Not Retain, 所以对象释放前一定要移除观察者。消息的发送主要由触发,并且必须成对出现,方法用来控制,是否要主要添加上述的两个方法,默认返回值为YES,如果返回NO则不会自动添加,也就是说setter的调用以及KVC修改都不会触发通知此方法用来设置依赖关系,有时候需要某属性值随着同一对象的其他属性的改变而改变。

2023-04-27 20:00:38 768

原创 【iOS】—— KVC再学习

KVC的全称是KeyValueCoding,俗称“键值编码”,可以通过一个key来访问某个属性;KVC提供了一种间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量;它是一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。

2023-04-24 20:27:47 681

原创 【iOS】—— 响应者链和事件传递链

先触发响应者事件,接着触发触摸事件触摸事件传递过程是从父控件到子控件,即由UIApplication将事件发送到最顶层的控件,然后由这个控件向下逐级传递事件,直到找到最合适的处理者为止。在传递过程中,如果一个控件能够响应事件,那么就会处理事件并结束传递;如果不能响应事件,那么就会将事件传递给下一个响应者。而响应者链的传递过程则是从子控件到父控件。当一个控件接收到事件后,它首先会将事件交给自己的响应者对象处理,然后再交给它的父控件的响应者对象处理,直到到达最顶层的响应者对象为止。

2023-04-23 14:24:09 1321

原创 【iOS】—— Masonry源码学习(浅看,未完)

Masonry在我们之前的学习中是一个非常有用的第三方库。Masonry是一种基于Objective-C语言的轻量级布局框架,它可以简化iOS应用程序中的自动布局任务。Masonry提供了一个方便的API,可以编写更加简洁和易于阅读的代码来创建约束。使用Masonry,您可以通过链式调用方法来设置视图之间的约束关系,而无需直接操作NSLayoutConstraint对象。简单来说,Masonry就是封装了。在学习源码之前,我们先来看看。

2023-04-20 20:56:07 876

原创 【iOS】—— 消息传递和消息转发

1.检查消息接收者receiver是否存在,为nil则不做任何处理2.通过receiver的isa指针找到对应的class类对象3.找到class类对象进行内存平移,找到cache4.从cache中获取buckets5.从buckets中对比参数sel,看在缓存里有没有同名方法6.如果buckets中有对应的sel --> cacheHit --> 调用imp7.如果buckets中没有对应的->(c/c++慢速查找)1.从本类的(二分查找/遍历查找)查找imp2.从本类的父类的。

2023-04-16 17:22:09 618

原创 【iOS】—— NSOperation、NSOperationQueue

是苹果提供给我们的一套多线程解决方案。实际上是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。如果使用子类 NSInvocationOperation、NSBlockOperation 不能满足日常需求,我们可以使用自定义继承自 NSOperation 的子类。可以通过重写 main 或者 start 方法 来定义自己的 NSOperation 对象。重写main方法比较简单,我们不需要管理操作的状态属性 isExecuting 和 isFinished。

2023-04-07 16:32:44 610

原创 【iOS】—— 类和对象底层探索

OC对象在发送消息时,运行时库会追寻着对象的isa指针得到对象所属的类。这个类包含了能应用于这个类的所有实例方法以及指向父类的指针,以便可以找到父类的实例方法。运行时库检查这个类和其父类的方法列表,找到与消息对应的方法。编译器会将消息转换为消息函数objc_msgSend进行调用我们可以知道,OC的类其实也是一个对象,一个对象就要有一个它属于的类,意味着类也要有一个isa指针,指向其所属的类。那么类的类是什么呢?就是我们所说的元类(MetaClass),所以,元类就是类对象的所属类。

2023-04-04 14:55:40 621

原创 【iOS】—— 多线程之pthread、NSThread

pthread 是一套通用的多线程的 API,可以在Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,使用难度较大。POSIX 线程(英语:POSIX Threads,常被缩写 为 Pthreads)是 POSIX 的线程标准,定义了创建和操纵线程的一套 API。实现 POSIX 线程标准的库常被称作 Pthreads,一般用于 Unix-like POSIX 系统,如 Linux、Solaris。

2023-03-30 11:59:25 396

原创 【iOS】—— MRC

有很大一部分知识再上一期ARC里面也讲过了,包括内存管理的四大原则,所有权修饰符等,在这一期中会补充一些MRC的知识。

2023-03-29 17:13:56 375

原创 【iOS】—— SDWebImage源码学习

这里先将任务加入到正在执行的列表里面,然后再对context进行预处理,源代码是没有对options进行说明处理的,然后将context跟options放入result里面。在下载任务开始的时候,SDWebImageManager首先访问SDImageCache来查询是否存在缓存,如果有缓存,直接返回缓存的图片。实际上,所有的操作都是由一个实际上,所有的操作都是由一个operationDictionary字典维护的,执行新的操作之前,cancel所有的operation。

2023-03-22 13:43:05 447

原创 【iOS】—— ARC学习

_bridge可以实现Objective-C与C语言变量 和 Objective-C与Core Foundation对象之间的互相转换__bridge不会改变对象的持有状况,既不会retain,也不会release__bridge转换需要慎重分析对象的持有情况,稍不注意就会内存泄漏__bridge_retained用于将OC变量转换为C语言变量 或 将OC对象转换为Core Foundation对象。

2023-03-20 22:00:01 794

原创 【iOS】—— 分类,扩展和关联对象

在上周中学习JSONModel源码的过程中,源码里用到了许多关联对象的知识,之前在学小蓝书的时候对这一部分内容学习并不完整,在这作以补充:从结构体可以知道,有属性列表,所以分类可以声明属性,但是分类只会生成该属性对应的get和set的声明,没有去实现该方法。结构体没有成员变量列表,所以不能声明成员变量。方法可以运行时改变,结构体不能运行时改变,要想改变原结构体,增加一个属性,只能用关联变量的方式,而关联本质是在类的定义之外为类增加额外的存储空间,是一层映射关系关联对象通过关联对象给分类添加属性

2023-03-14 17:34:47 450

原创 【iOS】—— JSONModel源码学习

value可用的情况下,就开始进行赋值,有setter方法的通过setter方法赋值,基础类型int,float等直接赋值,如果property又是一个JSONModel,就递归先将子Model进行整体解析。+load方法会在加载类的时候就被调用,也就是iOS应用启动的时候,就会加载所有的类,就会调用每个类的+load方法。整个代码的执行流程: 首先,在这个模型类的对象被初始化的时候,遍历自身到所有的父类(直到JSONModel为止),获取所有的属性,并将其保存在一个字典里。

2023-03-13 15:55:43 514

原创 【iOS】—— 浅看block源码

之前在学习block中学习的比较浅,只看了oc高级编程书上有的源码,学习的比较浅,这节来对之前的作以补充。首先来看看怎么将oc文件生成cpp的源码文件:将项目大文件里的二级文件,打开终端 cd 并将此文件拖入:然后再输入:回车打开之前的项目文件,即可看到生成了一个cpp文件,打开就是oc的c++源码。打开后发现有60000多行,很抽象,关键部分看最前面和最后面即可。我们现在时文件中写一个最简单的block,看看源码是什么:源码:我们来分开说一下每部分的意义:1.第一个结构体结构体的名称:

2023-03-07 18:29:23 522

原创 【iOS】—— 初识RAC响应式编程

一.核心:1.核心:信号类2.信号类的作用:只要有数据改变就会把数据包装成信号传递出去3.只要有数据改变就会有信号发出4.数据发出,并不是信号类发出,信号类不能发送数据二.使用方法:1.创建信号2.订阅信号三.实现思路:1.当一个信号被订阅,创建订阅者,并把nextBlock保存到订阅者里面。2.创建的时候会返回 [RACDynamicSignal createSignal:didSubscribe];3.调用RACDynamicSignal的didSubscribe。

2023-03-01 20:26:02 1285

原创 【iOS】—— 工厂设计模式

工厂设计模式这一年最后一篇博客了,希望在下一年里继续努力,早日实现梦想。

2023-01-20 22:38:42 2220

原创 【iOS】—— 内存的五大分区

全局区(静态区) (static): 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。程序启动的时候会单独加载全局变量,同理与全局静态变量,少使用。:不管对象方法还是类方法都可以访问和修改全局静态变量,并且外部类无法调用静态变量,定义后只会指向固定的指针地址,供所有对象使用,节省空间。:定义后只会存在一份值,每次调用都是使用的同一个对象内存地址的值,并没有重新创建,节省空间,只能在该局部代码块中使用。

2023-01-18 17:33:20 1611

原创 【iOS】—— 初识block

Blocks是带有自动变量(局部变量)的匿名函数。

2023-01-14 14:54:02 573

原创 【iOS】—— 初识GCD

Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。例子//让处理在后台线程中执行 dispatch async(queue , ^ {/**长时间处理*例如AR用画像识别*例如数据库访问*/ /*

2023-01-11 22:23:38 585

原创 【Effective Objective - C】—— 读书笔记(五)

Objective-C 语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器,如果某个对象引用他时就会给其引用计数加1,用完了之后,就递减其计数,直至为0,销毁这个对象。ARC实际上也是一种引用计数机制。在引用计数架构下,对象有个计数器,用以表示当前有多少个事物想令此对象继续存活下去。NSObject协议声明了下面三个方法用于操作计数器:查看保留计数的方法叫做retainCount,此方法不太有用, 即便在调试时也如此,所以笔者(与苹果公司)并不推荐大家使用这个方法。对象创建出来时,

2023-01-05 15:35:56 357

原创 【Effective Objective - C】—— 读书笔记(四)

就是说,你在外部.h文件中定义一个“只读”的属性,然后你又在“class-continuation分类”将其的“只读”属性改为“可读写”的,那么这样下来,在外部看来他就是一个“只读”的属性,但是你可以在其内部自定义的设置其值了,他在内部来说就是“可读写”的了。并且我们之前有说过私有方法的命名,通过特殊的前缀将私有方法指示出来,那么我们学了分类规划之后,我们还可以通过创建一个分类,这个分类其中全是私有方法,通过这种方法将这些私有方法都规划到一个类中,当然其还是的遵循之前的命名规则。

2023-01-01 15:13:32 745

空空如也

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

TA关注的人

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