自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 iOS——APP启动流程

条件准备:环境,平台,版本,路径,主机信息等等;确定是否有共享缓存并去加载(一般是非模拟器情况)载入GDB调试器通知。(老版本的不重要,没用,不知道这个名词没关系)添加dyld到UUID列表中,启用堆栈符号化。(没用,不需要知道)实例化主程序,instantiateFromLoadedImage(镜像文件加载器,就是以mach-o的header方式加载主程序镜像。加载任何插入的库,(使用loadInsertedDylib)link(链接)主程序link 镜像文件(前面插入的库)

2024-09-06 09:27:24 2218 1

原创 iOS——关联对象学习补充

类加载到内存中,需要重新构造类,构造的就是rw,rw包括rwe和ro类的处理包括给类映射类名、将类和元类添加到所有类的表中rw的构造过程就是给rw添加ro,并且生成rwerwe的生成过程是先添加ro的数据,之后获取到分类数据,添加到rwe中ro以及分类中的方法列表均要按照方法选择地址排序,方便后续的二分查找法在将方法列表添加到类的rwe时,需要倒序插入。后加载分类的在前面,后加载的分类在后面,类的数据在最后。对于运行时加载的分类情况:1.类与分类都实现load方法;

2024-09-06 09:26:00 1600

原创 iOS——方法交换Method Swizzing

Method Swizzing是发生在运行时的,主要用于在运行时将两个Method进行交换,我们可以将Method Swizzling代码写到任何地方,但是只有在这段Method Swilzzling代码执行完毕之后互换才起作用。利用Objective-C Runtimee的动态绑定特性,将一个方法的实现与另一个方法的实现进行交换。

2024-09-05 21:30:02 1982

原创 iOS——runLoop

RunLoop实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行相应的处理逻辑。线程执行了这个函数后,就会处于这个函数内部的循环中,直到循环结束,函数返回。RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。RunLoop和线程是绑定在一起的,每条线程都有唯一一个与之对应的RunLoop对象。不能自己创建RunLoop对象,但是可以获取系统提供的RunLoop对象。

2024-09-05 21:26:46 2157

原创 iOS——持久化

应用沙盒文件夹包含了:Application(应用程序包):包含了所有的资源文件和和可执行文件,上架前经过数字签名,上架后不可修改。Documents:文档目录,要保存程序生成的数据,会自动被分到iCloud中。保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。(注意点:不要保存从网络上下载的文件,否则会无法上架!Library:用户偏好,使用 NSUserDefault 直接读写!如果要想数据及时写入磁盘,还需要调用一个同步方法。

2024-09-05 21:23:29 1747

原创 iOS——frame和bounds的区别

frame: 描述视图在其父视图中的位置和大小,是“绝对”的。bounds: 描述视图自身的内容区域和尺寸,是“相对”的。

2024-09-05 21:22:30 1345

原创 iOS——线程安全、线程同步与线程通信

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作(更改变量),一般都需要考虑线程同步,否则的话就可能影响线程安全。

2024-09-05 21:21:35 2048

原创 iOS——GCD再学习

在异步方法内又同步执行了一个方法,又因为同步执行中的方法执行完成前会阻塞当前线程,因此任务3执行完成前会一直阻塞线程,但是这个同步方法是处于串行队列的,因此要执行任务3要等待任务4执行完,但是任务4又要等任务3执行完才能执行,因此发生了死锁,跟那个主队列+同步执行差不多。syncConcurrent任务在其他线程中执行到追加 任务 1 到主队列中,因为主队列现在没有正在执行的任务,所以,会直接执行主队列的 任务1,等 任务1 执行完毕,再接着执行 任务 2、任务 3。(异步执行 具备开启新线程的能力。

2024-09-05 21:19:16 2026

原创 iOS——通知协议代理

通知机制的核心是一个与线程关联的单例对象叫通知中心(通知中心发送通知给观察者是同步的,也可以用通知队列()异步发送通知。

2024-09-05 21:10:43 1727

原创 iOS——Block与内存管理

1、对象类型的auto变量。2、引用了 __block 修饰符的变量。

2024-09-05 21:03:06 1522

原创 iOS——retain和release底层原理

这段代码的逻辑是:首先初始化并赋值变量,然后进入循环,检查newisa是否为 nonpointer isa,如果不是,则清除isa的原子锁。如果tryRetain为真,则尝试调用增加引用计数,否则调用增加引用计数。如果对象正在被释放,则清除isa的原子锁,并根据条件返回nil或对象。接着,尝试增加引用计数并检查是否溢出,如果溢出,则将部分引用计数转移到 side table 并设置相关标志。循环结束时,检查并处理 side table 的引用计数操作。这段代码用于尝试增加对象的引用计数。

2024-09-05 20:59:16 1395

原创 iOS——atomic、nonatomic、assign、_unsafe_unretain

在iOS开发中,当你定义一个属性时,编译器会自动为你生成一个带下划线的成员变量(实例变量)以及对应的getter和setter方法。如果你使用atomic修饰这个属性,那么编译器在生成setter和getter方法时,会在这些方法的内部实现中加入加锁操作。但是加锁只能保证getter和setter方法内部的线程安全,并不能保证对该属性的所有操作都是线程安全的。可以看出来在两个方法中,使用atomic修饰的话,对值的设置都会有加锁和解锁的步骤。

2024-09-05 20:55:50 1808

原创 iOS——strong和copy的底层实现

打印出的结果是:可以看出来使用copy修饰的strCopy的值没有改变。根据前面的学习我们知道:copy修饰的变量,对象地址不一致了,指针指向了一个新的内存区域(相当于深拷贝),导致新值(newString)修改时不会影响。

2024-09-05 20:53:57 1512

原创 iOS——weak修饰符的学习补充

ObjectC中对对象的存储,实现上做了一定的优化,一旦有弱引用对象被赋值,即运行时(Runtime)会在全局的SideTables中分配一个SideTable空间,此空间是根据对象的地址相关算法获取到的一个位置(所以存在多个对象分配到同一个位置,类似哈希冲突)。slock:自旋锁,用于多线程环境下的同步。RefcountMap:引用计数映射表,管理对象的引用计数。键值为对象指针,对应value为引用的一些标记位以及状态weak_table:弱引用表,管理对象的弱引用。是一个散列表。

2024-09-05 20:51:34 1404

原创 iOS——内存管理超详解!!

在前面,我们简单学了MRC与ARC。MRC指手动内存管理,需要开发者使用retainrelease等手动管理对象的引用计数,确保对象在必要时被释放。ARC指自动内存管理,由编译器自动管理对象的引用计数,开发者不需要手动管理内存。这是因为。

2024-09-05 20:46:48 1621

原创 iOS——内存五大分区

如果值仅一个类中的对象和类方法使用并且值可变,可以定义全局静态变量,如果是多个类使用并可变,建议值定义在model作为成员变量使用。从内存优化和程序编译的角度来说,尽量少用全局静态变量,因为存在的生命周期长,一直占用空间。使用全局变量的原因就在于其对外的特性,但是其使用的方便性没有使用model的属性或宏来得方便。定义后只会存在一份值,每次调用都是使用的同一个对象内存地址的值,并没有重新创建,节省空间,只能在该局部代码块中使用。不同于变量,常量的值是固定不可变的,一般用于只读值。

2024-09-05 20:45:15 876

原创 iOS——编译链接

库是已经编译完成的二进制文件。代码需要提供给外部使用又不想代码被更改,就可以把代码封装成库,只暴露头文件以供调用。希望提高编译速度,可以把部分代码封装成库,编译时只需要链接。库都是需要链接的,链接库的方式有静态和动态,所以就产生了静态库和动态库。

2024-07-17 10:57:40 1384

原创 iOS——MRC与ARC以及自动释放池深入底层学习

在前面,我们简单学了MRC与ARC。MRC指手动内存管理,需要开发者使用retainrelease等手动管理对象的引用计数,确保对象在必要时被释放。ARC指自动内存管理,由编译器自动管理对象的引用计数,开发者不需要手动管理内存。这是因为。

2024-07-16 20:17:36 1091

原创 iOS——内存五大分区

如果值仅一个类中的对象和类方法使用并且值可变,可以定义全局静态变量,如果是多个类使用并可变,建议值定义在model作为成员变量使用。从内存优化和程序编译的角度来说,尽量少用全局静态变量,因为存在的生命周期长,一直占用空间。使用全局变量的原因就在于其对外的特性,但是其使用的方便性没有使用model的属性或宏来得方便。定义后只会存在一份值,每次调用都是使用的同一个对象内存地址的值,并没有重新创建,节省空间,只能在该局部代码块中使用。不同于变量,常量的值是固定不可变的,一般用于只读值。

2024-07-15 11:29:46 965

原创 iOS——KVO底层学习

* 添加观察者方法 */// 确认观察者实现了 observeValueForKeyPath:ofObject:change:context: 方法return;// 如果没有实现该方法,直接返回// 加锁// 获取路径信息if (pathInfo == nil) // 如果路径信息为空// 创建新的路径信息// 复制路径字符串,使用不可变对象作为键// 插入路径信息到路径映射表// 释放路径信息// 释放路径字符串// 获取观察者数量。

2024-06-11 22:34:01 1150 2

原创 iOS——分类、扩展和关联对象

回顾一下什么是分类、什么是扩展:分类(Category)和类扩展(Extension)是两种常见的代码组织方式,用于扩展类的功能。

2024-06-10 21:26:41 1470 1

原创 iOS——类与对象底层探索

当我们使用OC创建一个testClass类并在main函数创建它的实例对象的时候,OC的底层到底是什么样的呢?首先,我们要了解OC对象的底层结构,那么我们就得知道:OC本质底层实现转化其实都是C/C++代码。struct NSObject_IMPL的具体实现:该结构体中只有一个Class isa;发现Class实际上就是一个指针,指向了objc_class类型的结构体。关于objc_class,我们在下面的类结构中讲。

2024-06-02 18:28:04 1199

原创 iOS——Tagged Pointer

标记指针(Tagged Pointer)是一种优化技术,用于在不分配额外内存的情况下存储小的对象或数字值。在这种技术中,指针的最低有效位(LSB)用于存储特殊标记,而不是指向分配的内存地址。传统上,Objective-C 对象都是通过指针引用的,指针指向一个存储在堆内存中的对象实例。然而,对于一些小的对象,如NSNumber、NSDate等,它们只包含了一些简单的数据,没有必要为它们分配额外的内存空间。因此,为了节省内存和提高性能,Objective-C 引入了标记指针。

2024-05-15 15:50:21 1192

原创 iOS——工厂模式

所谓设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的 高内聚 和 低耦合。可以这么说,计算机中设计模式指的是一套广为人知、被反复使用、经过分类编目的代码设计经验。使用设计模式是为了可重用代码,让代码更容易被他人理解,最重要的是保证代码可靠性。

2024-05-14 23:16:58 1148

原创 iOS——runtime

iOS——消息传递和消息转发。

2024-05-14 19:09:26 811

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

从本类的 method list (二分查找/遍历查找)查找imp从本类的父类的cache查找imp(汇编)从本类的父类的method list (二分查找/遍历查找)查找imp:…继承链遍历…(父类->…->根父类)里找cache和method list的imp若上面环节有任何一个环节查找到了imp,跳出循环,缓存方法到本类的cache,并返回imp直到查找到nil,指定imp为消息转发,跳出循环,执行动态方法解析resolveMethod_locked。

2024-05-14 18:21:50 1928

原创 iOS——SDWebImage源码学习

什么是SDWebImageSDWebImage是一个流行的iOS和macOS平台上的开源库,用于异步加载和缓存网络图片。它提供了一套简单易用的API,使得在应用中加载网络图片变得更加方便和高效。主要特点和功能:异步加载:SDWebImage通过异步方式加载网络图片,避免了阻塞主线程的问题,提高了应用的流畅性和响应性。缓存管理:SDWebImage实现了内存缓存和磁盘缓存,可以有效地管理已加载过的图片,避免重复加载和节省网络带宽。图片处理:支持对图片进行解码、压缩和裁剪等处理,以满足不同需求下的图

2024-05-06 21:13:15 1548

原创 iOS——NSCache

NSCache是Foundation框架中的一个类,用于在iOS和macOS应用程序中进行临时性的内存缓存。它提供了一种轻量级的缓存机制,可以用于存储临时性的数据,例如图片、对象等。:NSCache用于存储需要临时性缓存的数据,这些数据在应用的生命周期内需要频繁访问,但并不需要永久保存。:NSCache会自动管理缓存中的对象,当系统内存不足时,NSCache会自动释放部分缓存对象以腾出内存空间。:NSCache使用键值对的方式来存储和访问缓存数据。通过键(Key)可以快速查找对应的值(Value)。

2024-04-26 21:38:40 1549 4

原创 iOS——【GCD】

GCD指的是Grand Central Dispatch,它是苹果公司开发的一套多线程编程技术。GCD提供了一种简单而有效的方式来管理应用程序中的并发任务。它通过将任务提交到适当的队列(串行队列或并发队列)来管理并发执行的任务,从而帮助开发者更轻松地实现并发编程,提高应用程序的性能和响应速度。上面的就是在后合线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。这样,dispatch_async (queue, ^{ 这仅有 一行的代码表示让处理在后台线程中执行。

2024-03-26 18:43:22 1505

原创 iOS——【Blocks】

Blocks是C语言的扩充功能,即带有自动变量的匿名函数。匿名函数就是不带函数名的函数。这一概念同样被称为“闭包”,lambda计算等。自动变量是在函数内部声明的变量,其作用域仅限于声明它的函数内部。这意味着它们只能在其声明的函数内部使用,并且在函数执行完毕后会被自动销毁。

2024-03-17 23:11:19 1238 1

原创 iOS——【自动引用计数】ARC规则及实现

objc_autoreleaseReturnValue 函数会检查使用该函数的方法或函数调用方的执行命令列表,如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_retainAutoreleasedReturnValue( ) 函数,那么就不将返回的对象注册到autoreleasepool 中,而是直接传递到方法或函数的调用方。顾名思义,它是用于自己持有(retain)对象的函数,但它持有的对象应为返回注册在autoreleasepool 中对象的方法,或是函数的返回值。

2024-03-08 19:04:40 1514

原创 Effective Objective-C 学习(四)

CoreFoundation 框架也定义了一套C 语言API,用于操作表示这些collection 及其他各种collection 的数据结构。例如,NSArray 是Foundation 框架中表示数组的 Objective-C 类,而CFArray 则是 CoreFoundation 框架中的等价物。这两种创建数组的方式也许有区别,然而有项强大的功能可在这两个类型之间平滑转换,它就是 “无缝桥接”(toll-free bridging)。

2024-02-18 16:26:47 2339 1

原创 Effective Objective-C 学习(三)

performSelector 是 Objective-C 中的一个方法,用于在对象上调用指定的方法,并且可以延迟执行或在指定的线程上执行。它会在当前线程中调用指定的方法 aSelector,如果方法有返回值,则返回该返回值;如果方法没有返回值,则返回 nil。它相当于直接调用选择子:[object selectorName];这种编程方式极为灵活,经常可用来简化复杂的代码。

2024-02-17 20:58:19 7407

原创 Effective Objective-C 学习(二)

有时需要在对象中存放相关信息。这时我们通常从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,有时候类的实例可能是由某种机制所创建的,而开发者无法令这种机制创建出自己所写的子类实例。Objective-C 中有一项强大的特性可以解决此问题,这就是“关联对象”。

2024-01-21 18:18:55 3043

原创 Effective Objective-C学习(一)

OC将堆内存管理抽象出来了。不需要使用malloc或者free来分配或释放对象所占的内存。OC运行期环境把这部分工作抽象成一套内存管理架构,名为“引用计数”。OC为C语言添加了面向对象特性,是其超集。OC使用动态绑定的消息结构,也就是说在运行的时候才会检查对象类型。接收一条消息后,究竟应执行哪种代码,由运行期环境而非编译器来决定。

2024-01-14 20:36:16 1733

原创 iOS——UIPickerView选择器

UIPickerView是 iOS 开发中常用的用户界面组件之一,用于在垂直方向上显示一个滚动的列表,用户可以通过滚动选择其中的一项。

2023-12-09 18:04:53 1500

原创 iOS——调用系统相册和相机

表示媒体的类型,是图片还是视频。

2023-12-09 17:13:22 1267

原创 iOS——定位与地图

平时在写项目的时候可能会遇到需要使用定位服务的地方,比如说获取位置和导航等。因此这里我会使用OC自带的库以及苹果系统的地图来获取定位以及显示在地图上。

2023-12-09 16:42:56 1955 1

原创 iOS——POST请求

这里我使用的url是一个模拟后端的网站提供的URL,网站名:RequestBin,谷歌搜就行。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

2023-11-26 20:35:43 914

原创 仿写知乎日报第四周

本周主要修改了以往的一些bug,实现了一些遗漏的新功能。

2023-11-12 21:50:12 278

空空如也

空空如也

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

TA关注的人

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