自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【iOS】—— JSONModel

JSONModel是一个在iOS应用程序中使用的开源库,主要功能是JSON数据映射到Objective-C对象上。使用JSONModel可以方便地处理服务器返回的JSON格式的数据,将其转化为Objective-C对象,使得数据访问变的更加简单。JSONModel提供了一种间接的方式来定义数据模型,开发者只需要创建一个继承自JSONModel的类,并在其中定义属性,将可以将JSON数据映射到对象上。JSONModel之间的嵌套关系可以通过嵌套JSONModel子类来实现。

2024-08-16 21:52:20 952

原创 【iOS】—— 离屏渲染

当我们开启光栅化后,会在首次产生一个位图缓存,当再次使用时候就会复用这个缓存。而且产生的位图缓存的大小是有限制的,一般是2.5个屏幕尺寸。所以我们要根据使用场景而定。苹果系统不能够一次去处理视图,需要一张一张的处理视图,那么就需要开辟一个离屏缓存区去存储一张一张处理好的视图,开辟的这个离屏缓存区导致离屏渲染。有些效果被认为不能直接呈现到当前屏幕上,需要在其他地方做额外的处理,图层属性的混合体在没有愈合成之前不能直接加载到屏幕上,所以需要离屏渲染。指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区操作。

2024-08-13 10:47:05 1074

原创 【iOS】—— Runloop和多线程问题总结

runloop总结1. runloop简介2. runloop的基本作用3. 获取runloop的流程4. runloop和线程的关系5. runloop中的Mode有几种以及作用6.runloop的事件源7. 讲一下source0和source18. runloop的六种观察者模式9. 针对定时器在滑动时停止工作的问题10. 如何解决定时器不准确的原因11. 什么是常驻线程,线程保活多线程1. 队多线程的理解好处坏处2. iOS多线程的方式有哪几种3. 有用过GCD吗4. GCD的队列类型。

2024-08-12 16:31:51 1108 1

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

分类中没有成员列表,因此不能添加成员变量。但是有属性列表,可以添加属性的声明,但是不会合成set与get方法,如果要使用分类中的属性,需要使用关联对象。分类在运行的时候被整合到类中,扩展在编译的时候被整合到类中,因此分类中的方法不实现不会报错,扩展就会报错。扩展用于声明私有属性与方法。分类中的方法和类中的方法重名,分类中的方法会代替类中的方法。

2024-08-12 16:25:24 1013

原创 【iOS】—— 方法交换

的支持,在这样一个类中,有一个isa指针,指针指向该类定义的结构体,这个结构体中包括,指向其父类定义的指针以及。,通过消息发送的原理,会进行慢速查找,找到父类方法,此时父类方法的实现变成了子类的。**分析:**没有引起递归,因为进行了方法交换,所以调用对象方法。再进行方法交换操作,建议在单例模式下进行,避免重复调用交换。,在load方法对这两个方法进行交换,同时。**分析:**成功调用,子类调用父类的方法。的实现,找不到这个方法,所以报错。方法,最终的实现的方法为父类的。类,类中有一个实例方法,

2024-08-12 16:23:17 649

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

2. 响应者链响应者链传递流程总结响应者链流程初始事件传递链和响应者链能够响应触摸事件触摸点在自己的边界范围内没有任何子视图或者所有子视图都不在触摸点上。判断当前视图能否响应,再去判断当前视图的,如果是VC的View,那么就是VC。如果不是控制器的View,上一个响应者就是SuperView。第一响应者->super view->......->ViewController->window->application触摸事件发生之后,系统会生成简单的UIEvent。将UIEvent产生的事件添加到。

2024-08-08 15:25:52 1034

原创 【iOS】—— autoreleasePool以及总结

1. 什么是autoreleasePooltokenkill()方法3. 总结3.1 autoreleasePool的原理3.2 autoreleasePool的问题3.2.1 autoreleasepool的嵌套操作3.2.2 autoreleasepool的释放时机3.2.3 那些对象可以加入到autoreleasePool中3.2.4 关于哨兵对象和next指针(自动释放池)是在和Swift中用于管理内存释放的机制。

2024-08-06 21:36:28 1609 1

原创 【iOS】—— iOS锁

Lock 方法是加锁,unlock 是解锁,tryLock 是尝试加锁,如果失败的话返回 NO,lockBeforeDate: 是在指定Date之前尝试加锁,如果在指定时间之前都不能加锁,则返回NO。保护的代码块时,会尝试获取与传入对象关联的锁,如果锁没有被其他线程持有,那么该线程将获得锁并执行临界区的代码。当一个线程试图获取一个已经被占用的锁时,它不会排队等待,而是立即返回,这意味着它可能在其他等待的线程之前再次尝试获取锁。如果锁已经被占用,其它试图获取锁的线程会等待,直到锁重新可用。

2024-08-02 09:23:32 1113

原创 【iOS】—— pthread和NSThread

pthread 是一套通用的多线程的 API,可以在Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,使用难度较大,我们在 iOS 开发中几乎不使用 pthread。互斥锁是一种同步机制,用于保护共享资源在多线程环境下的互斥访问,防止多个线程同时修改同一资源而引发的竞争条件(race condition)。互斥锁提供了一种线程同步的机制,确保在任意时刻只有一个线程可以访问被保护的共享资源,从而避免了数据竞争和不确定行为。

2024-08-01 15:48:35 902

原创 【iOS】—— iOS持久化

/文件路径搜索该方法返回值为一个数组,在iphone中由于只有一个唯一路径,所以直接取数组第一个元素即可。参数一 NSSearchPathDirectory directory:指定搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录。

2024-07-31 11:22:22 801

原创 【iOS】—— Frame和Bounds的区别

frame不管对于位置还是大小,改变的都是自己本身。frame的位置是以父视图的坐标系作为参考,从而确定当前视图在父视图中的位置。frame的大小改变时,当前视图的左上角位置不会改变,改变的只是大小。bounds改变位置时,改变的是子视图的位置,自身没有受到影响,其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角。bounds改变大小时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就想缩放一样。

2024-07-31 11:14:35 892

原创 【iOS】—— KVO与KVC

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

2024-07-29 16:50:48 1075

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

单例模式在整个工程中,相当于是全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,一旦创建一个单例类,不论在哪里调用这个单例方法,创建的所有对象都指向同一块内存地址。(即单例类保证了该类的实例对象是唯一存在的一个)存储是以name和object为维度,判断是不是同一个通知要从name和object区分。存储过程并没有做去重操作,这也解释了为什么同一个通知注册多次则响应多次。发送通知使用方法:,或者发送通知,后者默认userInfo为nil// 发送通知。

2024-07-29 09:37:30 683

原创 【iOS】—— Block总结

1. Block的使用规范2. __block修饰符__block修饰符的底层原理3. Block的类型4. Block的实现及本质初始化部分调用部分本质5. Block的捕获与内存管理捕获变量捕获对象内存管理6. 循环引用什么是循环引用循环引用解决方法1. 强弱共舞2. 手动中断循环3. 参数形式解决循环引用(block传参)循环引用的案例对象持有导致对象不能及时的正常释放,容易造成内存泄漏。@end@endself持有了block,block持有了self,导致循环引用。

2024-07-25 15:45:38 1099 1

原创 【iOS】—— retain\release实现原理和属性关键字

首先来看一下retain的源码:我们根据图来看一下retain步骤:看一下release的源代码:我们根据图来看一下release步骤:属性关键字是用来修饰属性的关键字,保证程序的正常执行。weak将常用来修饰OC对象数据类型,修饰的对象释放之后,指针会自动置nil,这是弱引用的表现。**在ARC的环境下,为了避免循环引用,delegate往往是用的是weak修饰。在MRC下使用assgin修饰。**当某个对象不再拥有strong类型的指向的时候对象就会被释放,即使还有weak类型的指针指向它,wea

2024-07-25 15:37:16 940

原创 【iOS】—— 类与对象的底层

从源码中可也看到,class_data_bits_t 有一个属性uintptr_t bits,uintptr_t是无符号整数类型,能够存储指针,可以提高内存的利用率,它不止存储class_rw_t结构体指针,还存储其他的信息。​ 从字面上解读:class_ro_t的ro代表的是“只读”,class_rw_t中的rw代表的是“读写”,class_rw_ext_t中的rw_ext表示可读可写的扩展。指针,因此每一个新定义的类,它对应的结构体当中都会有一个这样的class类型的isa指针。

2024-07-23 09:51:18 982

原创 【iOS】—— weak实现原理

weak的原理在于底层维护一张weak_table_t结构的hash表,key是所指对象的地址,valud是weak指针的地址数组。weak关键字的作用是弱引用,所引用对象的计数器不会+1,并在引用对象被释放的时候自动设置为nil;对象释放的时候,调用clearDeallocating函数根据对象地址获取所有的weak指针地址的数组,然后遍历这个数组设为nil,最后把entry从weak表中删除,最后清理对象的记录。

2024-07-22 20:02:12 1419

原创 【iOS】—— isMemberOfClass & isKindOfClass以及源码

类方法:元类 --> 根元类 --> 根类 --> nil 与 传入类的对比。实例方法:对象的类 --> 父类 --> 根类 --> nil 与 传入类的对比。类方法: 类的元类 与 传入类对比。实例方法:对象的父类 与 传入类对比。通过上面的源码解析分析代码:ret1 = 1,传入的cls为NSObject,self指的是NSObject,进入循环。

2024-07-19 09:22:33 1128

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

检查接受者是否存在,为nil则不做任何处理;通过receiverdeisa指针找到对应的class类对象;找到类对象之后通过内存平移找到cache;从cache中获取buckets;从buckets中对比sel,查看是否有同名方法;如果有对应的sel,就会进入到cacheHit,调用imp;如果没有对应的sel,进入objc_msgSend_uncached,然后到lookUpImpOrForward(慢速查找)。

2024-07-18 19:18:33 1591

原创 【iOS】—— 编译链接

dyld(the dynamic link editor)是苹果的动态链接器,是苹果操作系统一个重要组成部分,在系统内核 XNU 完成 Mach-O 文件的加载,做好程序准备工作之后,交由 dyld 负责余下的工作。​ **优点:**节省磁盘空间,且多个用到相同动态库的程序同时运行,库文件会进行共享。**在编译的时候动态库不会被拷贝到程序中,只会存储下动态库的引用,等找到真正使用的时候才回去查找-绑定-使用函数。​ **优点:**在编译链接的时候被整合到可执行文件中,是程序运行的时候独立,不依赖外部库。

2024-07-17 16:45:37 1028

原创 【iOS】—— Tagged Pointer

为了存储和访问一个NSNumber对象,我们需要在堆上为其分配内存,另外还要维护它的引用计数,管理它的生命期。这些都给程序增加了额外的逻辑,造成运行效率上的损失。对此提出了Tagged Pointer概念,由于NSNumber、NSDate一类的变量本身的值需要占用的内存大小常常不需要8个字节,拿整数来说,4个字节所能表示的有符号整数就可以达到20多亿。所以我们可以将一个对象的指针拆成两部分,一部分直接保存数据,另一部分作为特殊标记,表示这是一个特别的指针,不指向任何一个地址。

2024-07-17 11:30:18 826

原创 【iOS】—— MRC

无论是否是自己创建的对象,自己都可以持有,并负责释放。计数器有加就有减。曾经让对象的计数器 +1,就必须在最后让对象计数器 -1。

2024-07-16 20:12:49 1080

原创 【iOS】—— 继承者链

对象的isa指针指向类,类也是一种对象被称为类对象,其isa的指向是元类。元类是系统给的,定义和编译是由编译器完成的。每个类都有独一无二的元类,用来存储类方法。对象 --> 类 --> 元类 --> NSobject,NSObject指向自身。

2024-07-16 20:05:29 1127

原创 【iOS】—— 多线程NSOperation和NSOperationQueue

NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。

2024-06-16 19:39:06 857

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

iOS的响应者链机制的步骤是先通过hitTest和PointSide方法找到合适的控件-Initial View如果这个响应者能够响应则进行Initial View -> View Controller(如果存在) -> superview -> · ·· -> rootView -> UIWindow -> UIApplication。

2024-06-11 21:23:02 883

原创 【iOS开发】—— 初学Runtime

Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发。Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。Objective-C 是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态的创建类和对象、进行消息传递和转发。

2024-06-02 20:06:03 936

原创 【iOS开发】—— KVC

KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。

2024-05-26 20:17:00 933

原创 【iOS开发】—— KVO原理

主要用了isa-swizzling,修改了观察者的类信息,并且hooksetter方法,当setter方法调用时发送消息给所有观察者。由上面源码可以看出对观察者、被观察者的引用都是Not Retain, 所以对象释放前一定要移除观察者。

2024-05-19 16:20:43 921

原创 【iOS开发】—— 初识锁

自旋锁是一种同步机制,用于在多线程环境中保护共享资源的访问。它通过循环忙等待的方式,而不是阻塞线程,来实现对共享资源的互斥访问。1.区别:等待机制互斥锁是阻塞锁,当锁被其他线程占用时,请求线程会被阻塞;自旋锁是忙等待锁,请求线程会循环忙等待,不断检查锁的状态。CPU占用自旋锁是忙等待,当线程持有自旋锁时间较长时,其他等待线程会一直忙等待,浪费CPU资源;互斥锁是阻塞,当线程请求锁时,会被阻塞,释放CPU资源给其他线程。适用场景自旋锁适用于多核心CPU、共享资源占用时间较短的情况;

2024-05-12 11:29:15 792

原创 【iOS】-- 内存五大分区

程序员负责在何时释放内存,在ARC程序中,计数器为0的时候,在当次的runloop结束后,释放掉内存。由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如变量通过new、alloc、malloc、realloc分配的内存块就存放在堆区。,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。缺点:存在的生命周期长,从定义直到程序结束。栈区(系统管理的地方),堆区(程序员管理的地方),常量区,全局区(静态区),代码区。

2024-05-08 22:13:15 1082

原创 【iOS】-- Runloop初学

简单的说RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。在App运行的过程中,主线程的Runloop保证了主线程不被销毁从而保证应用的存活,从而能实时接收到用户的响应事件,能够触发定时事件。如果没有Runloop的话,程序执行完代码就会立马return。

2024-04-29 22:16:45 973

原创 iOS -- 工厂设计模式

专门定义一个类(工厂类)来负责创建其他类的实例。可以根据创建方法的参数来返回不同类的实例,被创建的实例通常具有共同的父类。抽象工厂模式里每个工厂都会生产多种产品,但不同工厂生产的产品属于不同的系列。简单工厂模式将对象的创建和使用分离,使得客户端代码更加灵活,并且可以降低代码的耦合度。**聚合:**表示一个类与其他类之间存在关联关系,其中一个类是另一个类的容器或集合,但这些类之间的关系并不是强依赖的关系。当系统中加入新产品时,除了需要提供新的产品类之外,还要提供与其对应的具体工厂类。

2024-04-19 23:12:05 1381 1

原创 【iOS】—— SDWebImage源码学习(2)(源码解读)

这里我们先看看SDWebImageDownloader。

2024-04-17 18:32:15 1379

原创 【iOS】—— SDWebImage源码学习(1)(未完)

在日常的使用中,通常是加载网络图片到UIImageView上展示,所以一般在需要使用SDWebImage的文件中只引用#import "UIImageView+WebCache.h"头文件。是一个枚举类型的值,用于设置加载图片的选项。这样就可以有下载进度的回调和下载完成的回调,可以在回调完成进度条相关的操作和显示图片相关的操作。在网络图片加载过程中,ImageView会显示占位图像,给用户一个视觉上的暂时反馈。当网络图片加载完成后,ImageView中会显示加载完成的图片。

2024-04-14 17:45:00 1256

原创 iOS —— 初识KVO

KVO传值也很简单,可以理解为我们对第二个viewController的某一个属性做一个监听,当我们跳转到第一个viewController的时候就可以监听到值的改变。KVO是一种开发模式,它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架下提供的一种开发机制,使用KVO,可以方便地对指定对象的某个属性进行观察,当属性发生变化时,进行通知,告诉开发者属性旧值和新值对应的内容。在textFiled中写入文本,然后通过按钮进入到下一个界面。

2024-03-28 20:55:12 1598

原创 【Objective -- C】—— GCD(1)(Grand Central Dispatch)

GCD的全称是Grand Central Dispatch,是异步执行任务的技术之一。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。为了开发者的方便,我们只需要定义想执行的任务并追加到适当的dispatch Queue中GCD就能自动生成必要的线程并计划执行任务,提升了效率。为什么使用GCDGCD 可用于多核的并行运算;GCD 会自动利用更多的 CPU 内核(比如双核、四核);GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);

2024-03-24 16:32:40 1038

原创 【Objective -- C】—— block

block是一个带有自动变量值的匿名函数,它也是一个数据类型,跟int double float一样都是数据类型.所以我们是可以创建一个block类型的变量。总结来说:block类似于一个方法。而每一个方法都是在被调用的时候从硬盘到内存,然后去执行,执行完就消失,所以,方法的内存不需要我们管理,也就是说,方法是在内存的栈区。所以,block不像OC中的类对象(在堆区),他也是在栈区的。

2024-03-16 17:54:41 1183

原创 【Objective -- C】—— 自引用计数

但是,在产生大量autorelease的对象的时候,只要不放废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时会产生内存不足的现象。典型的例子是读入大量图像的同时改变其尺寸。图像文件读入到 NSData 对象,并从中生成 UIImage 对象,改变该对象尺寸后生成新的 UIImage 对象。这种情况下,就会大量产生 autorelease 的对象。

2024-03-09 18:55:34 991

原创 【Effective Objective - C】—— 系统框架

无缝桥接”技术其实就是不同库之间相同类型的相互转换。使用“无缝桥接”技术,可以在定义于Foundation框架中的OC类和定义于CoreFoundation框架中的C数据结构之间互相转换。转换操作中的__bridge告诉ARC如何处理转换所涉及的OC对象。__bridge本身的意思是:ARC仍然具备这个OC对象的所有权。而__bridge_retained则与之相反,意味着ARC将交出对象的所有权。

2024-02-21 15:36:30 861

原创 【Effective Objective - C】—— block 块

本章的内容是比较麻烦复杂的一章,牵扯到了GCD和Block,在之前也有学习过,本章作以深入的了解。多线程问题是开发应用程序的时候最让人头疼的问题,尤其是线程阻塞,在更新了Mac之后我经常的遇到了彩虹小球的问题,当然在开发的时候还没有出现过线程阻塞问题。

2024-02-19 17:31:01 1296

空空如也

空空如也

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

TA关注的人

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