- 博客(129)
- 收藏
- 关注
原创 iOS 内存管理之 autoreleasePool
摘要 自动释放池(autoreleasePool)是一种延迟释放对象的机制。其核心实现是AutoreleasePoolPage构成的双向链表结构,通过push和pop方法管理对象生命周期。在MRC环境下需手动调用autorelease,而ARC环境由系统自动处理。源码分析表明,每个线程维护独立页栈,push操作插入POOL_BOUNDARY标记,pop反向释放标记间所有对象。AutoreleasePoolPage以4KB为单位存储对象,包含元数据及柔性数组,实现线程安全的延迟释放功能。该机制优化了内存管理效
2025-11-12 21:56:11
598
原创 OC母语的Developer对Swift常见问题的整理
本文涵盖了Swift编程中的7个核心知识点: 可选类型(Optional):介绍Optional的定义、必要性以及安全解包方法(可选绑定、强制解包等)。 Struct与Class:对比两者的值类型/引用类型特性,内存存储方式及适用场景。 闭包与循环引用:分析循环引用成因,通过weak/unowned捕获列表解决内存问题。 ARC机制:说明自动引用计数原理,比较Swift与Objective-C的ARC差异。 泛型编程:阐释泛型的类型抽象优势,展示其在数据结构和算法中的应用。 async/await:对比传统
2025-11-02 17:41:58
900
原创 iOS八股文之 组件化
组件化设计实践与方案对比 组件化是一种高内聚、低耦合的软件设计方法,通过分层拆解和标准化接口实现功能解耦。核心优势包括提升开发效率、支持并行开发、加速编译速度和促进代码复用。目前主流方案有四种: URL路由式:通过字符串URL进行通信,实现简单但类型不安全 协议接口式:基于Protocol定义接口,类型安全但维护成本较高 Target-Action反射式:利用运行时反射调用,彻底解耦但存在性能损耗 组合式方案:综合多种方式,适合复杂项目场景 关键实现技术还包括依赖管理、资源隔离和生命周期控制,需要平衡解耦程
2025-11-02 17:10:35
822
原创 iOS Runtime之 KVO
KVO(Key-Value Observing)是iOS中基于键路径的属性观察机制,通过运行时动态生成子类并重写setter方法实现属性变化的自动通知。使用步骤包括注册观察者、实现回调方法和及时移除观察者。开发中需注意注册/移除配对、防止重复操作、确保属性KVO兼容性、正确使用context参数以及线程安全等问题。Swift中需用@objc dynamic修饰属性才能支持KVO。KVO适用于数据驱动UI更新等场景,但要注意其潜在风险如野指针崩溃等。
2025-10-18 17:37:18
720
原创 iOS八股文之 网络
具体的网络库实现既可以依赖苹果原生NSURLSession,也可以使用优秀的三方库如AFNetworking,Alamofire等;
2025-10-18 12:01:39
1084
原创 iOS八股文之 多线程
iOS多线程核心技术解析: 核心方案:主要使用GCD(队列+任务)和NSOperationQueue(面向对象封装),前者适合简单并发,后者支持任务依赖、优先级等复杂场景。 关键机制: GCD通过串行/并行队列与同步/异步执行组合控制线程行为 NSOperationQueue提供任务管理(依赖、取消、优先级) 线程安全需用锁(@synchronized/NSLock)或信号量 典型场景: 异步处理耗时任务后主线程更新UI 信号量控制并发数防止线程爆炸 任务依赖实现有序执行链 常见陷阱: 子线程操作UI导致崩
2025-10-17 13:32:29
998
原创 iOS八股文之 内存管理
iOS内存管理核心机制与常见问题 iOS内存管理基于引用计数机制,通过ARC自动管理对象生命周期。核心机制包括: 引用计数:通过isa指针和SideTable存储计数,强引用(__strong)增加计数,弱引用(__weak)不影响计数 ARC:编译器自动插入retain/release代码,开发者无需手动管理 自动释放池:延迟释放临时对象,RunLoop控制主线程的释放时机 常见内存问题: 循环引用:Block捕获self、代理强引用、NSTimer未释放等 内存泄漏:单例持有大对象、未移除通知监听、大对
2025-10-17 11:21:11
1076
原创 iOS八股文之 RunLoop
iOS RunLoop 是管理线程事件循环的核心机制,通过Mode隔离不同场景的事件源(Sources0/1、Timers、Observers),实现"按需唤醒、隔离事件"。主线程RunLoop自动运行,子线程需手动启动。RunLoop关键应用包括:解决NSTimer滑动失效(CommonModes)、子线程保活(添加Port事件源)、滑动时暂停非必要任务优化性能。理解RunLoop对多线程编程、性能优化和卡顿监控至关重要。
2025-10-16 11:55:44
1103
原创 iOS八股文之 Runtime
这个看苹果文档的描述即可:Objective-C 语言尽可能将诸多决策从编译时和链接时推迟到运行时。只要有可能,它都会以动态方式处理事务。这意味着该语言不仅需要编译器,还需要一个运行时系统来执行已编译的代码。运行时系统就像是Objective-C 语言的一种操作系统,正是它让这种语言能够正常运行。runtime 主要用 C 语言编写(如objc.h、runtime.h中的 API),核心逻辑(如objc_msgSend)用汇编编写,目的是提升性能(汇编能直接操作寄存器,减少函数调用开销)。
2025-10-15 21:08:34
1110
原创 Swift中Struct和Class的区别
StructClassValue typeReference typeCopied when passed or assignedPassed around via pointersCopy on writeAutomatically reference countedFunctional programmingObject-oriented programmingNo inheritanceInheritance (single)“Free” i
2024-11-11 10:35:23
308
原创 Xcdoe快速更新安装的小Tips
现在的Xcode下载大小是变小了,Xcode16 压缩包仅有2.74G,但与之配套的模拟器也需要下载,坑爹的iOS 18 Simulator Runtime 需要下载8.05G;通过Xcode内部下载容易失败且下载慢;─=≡Σ(((つ•̀ω•́)つ 齐活,可以正常开发了。从AppStore更新估计有些慢的话;回车即可自动安装模拟器;
2024-09-24 14:52:39
785
原创 Xcode编译报错 #error unsupported Swift architecture
Xcode15 引入某些三方库时,真机跑起来没问题;但模拟器build时报错卡在。,注释掉代码也不行;
2024-06-17 10:22:16
3380
1
原创 iOS 使用Hex色值设置颜色(可设置透明度使用4个字节色值赋值)
简单来说就是用十六机制来表示三原色,三原色不同强度组合出不同颜色;Hex色值是什么(含透明度)
2024-04-23 16:45:53
1089
原创 Hex色值是什么(含透明度)
Hex代码为三字节的十六进制数字(即要写六个字符),其中每一字节或每两个字符分别代表三原色即红、绿、蓝颜色的强度。其格式如下:XXXXXX红绿蓝一个字节的十六进制字节取值为 00~FF;那么对应颜色强度定义为最低的00到最高强度FF。比如:白色由最高强度的三原色混合而成,每种颜色强度拉满,那么其Hex色值就为 #FFFFFF;黑色则完全相反,每种颜色强度最低,其Hex色值就为 #000000。那么三原色对应的色值就可写成如下:红色:#FF0000绿色:#00FF00。
2024-04-23 15:02:36
6196
原创 iOS UIDatePicker和NSDateFormatter强制设为24小时制显示
UIDatePicker 和 NSDateFormatter默认会受到系统设置里的时间格式影响,在设置 --> 通用 --> 日期与时间 --> 24小时制(是个滑动开关)如果用户在这里关掉了24小时制,相应的UIDatePicker会显示三列,左侧显示上午、下午;右侧两排显示最多12小时。但我们自己的应用内大部分时间需要保持24小时制显示UI,或者解析数据,并需要不受系统设置影响;
2024-01-18 12:07:27
1489
原创 iOS 如何使用protocol Buffers
Protocol buffers 开源并托管在Github,详见https://github.com/google/protobuf/google提供了pb转oc的方法,但是没有提供swift的,apple这里做了swift的使用,详见https://github.com/apple/swift-protobuf切记一定要安装3.0以上的版本,才支持OC,而且功能更好用;
2024-01-18 12:05:42
1610
原创 iOS 实现毛玻璃效果的简单方式
iOS提供了UIBlurEffect来快速实现毛玻璃效果,并提供了几种Style可供选择。style可选择枚举如下,iOS13后更丰富了可选样式。
2024-01-16 19:25:17
3191
原创 iOS CoreBluetooth 蓝牙广播如何解析获取到内容(如:kCBAdvDataServiceData)
这里的key其实是一个CBUUID类型,其可以通过 [CBUUID UUIDWithString:@“xxxx”] 方式构造一个;取到实际的value(NSData)
2024-01-16 10:48:56
1337
原创 iOS UIViewContentMode 不同效果图文对比
图片的宽度或者高度(至少一个)恰好与视图的宽度或者高度相等;图片的宽度或者高度(至少一个)恰好与视图的宽度或者高度相等;如果宽高比相同,等比例缩放;如果宽高比不同,会变形塞入;
2024-01-15 11:44:40
1735
原创 iOS 位运算符浅析:与、或、异或、取反、左移、右移
iOS开发中可以使用C语言位运算符主要包括六种:与( & )、或( | )、异或( ^ )、取反( ~ )、左移( >> )和右移(
2024-01-08 10:38:05
1008
原创 git add -A 和 git add -u 和 git add . 的区别
也就是说对于现在我们大部分已应用的2.x版本,git add -A和 git add . 没有区别,如果想要针对不同的改动来add,可以已根据上表来使用不同的参数;
2024-01-03 11:57:26
743
原创 UIPickerView和UIDatePicker 如何去掉SelectionIndicator,即中间选中那一个框
可以另辟蹊径,在创建一个pickerView后,遍历其subviews,找到这个框框,然后设置其backgroundColor为透明,然后再自己创建一个view,放在pickerview下面即可(^-^)V。坑爹的苹果对滚轮控件的自定义限制的太多,除完全自定义写一个滚轮外,日常简单需求稍微改下这俩picker,大部分内容无法自定义;1、 如果只是简单实现一个滚轮,字体大小可以通过缩放来搞定,当然也可以通过改变私有属性的方式去变更字体和颜色,但风险大,慎用;注意这里是两层subview遍历;
2023-11-24 15:52:38
802
原创 iOS CGRect CGPoint NSRange等结构体的NSLog打印输出
iOS的UIKit里提供了UIGeometry.h内有各结构体转换成NSString的方法,可用于打印输出;
2023-10-08 15:19:27
791
原创 Xcode 15 Assertion failed【iOS常见报错收集】
Xcode 15 Assertion failed: (false && "compact unwind compressed function offset doesn't fit in 24 bits"), function operator(), file Layout.cpp, line xxxx
2023-09-25 10:51:39
2246
1
原创 iOS 蓝牙连接 connectionSupervisionTimeout 是720ms 还是 2~6s
Supervision Timeout 的大小影响能耗及连接健壮性,需根据应用场景灵活设置此值来达到平衡,coreBluetooth API并未提供方法来修改connect的参数设置,故一般让机硬件来修改此Connection Parameter。这里720ms是iPhone作为主设connect时设定的connectionParameter,但是蓝牙协议允许外设来根据实际情况协商。
2023-09-20 20:37:24
976
1
原创 coreBluetooth报错: Error Domain=CBErrorDomain Code=6 \“The connection has timed out unexpectedly.\“
断开蓝牙连接后,回调参数error为:Error Domain=CBErrorDomain Code=6 “The connection has timed out unexpectedly.” UserInfo={NSLocalizedDescription=The connection has timed out unexpectedly.}
2023-09-20 17:33:21
1288
原创 iOS蓝牙 Connection Parameters 关键参数说明
允许从设备在没有数据要发的情况下,跳过一定数目的连接事件,在这些连接事件中不必回复主设备的包个数;事件间隔,为1.25ms的倍数。可以简单理解为,是两个连接着的蓝牙设备发送“心跳包”的时间间隔;超时时间,即如果BLE在这个时间内没有发生通信的话,就会自动断开,为10ms的倍数;范围是10 ~ 3200, 即 100ms ~ 32s;范围是 6 ~ 3200,即 7.5ms ~ 4s;范围是 0 ~ 499;
2023-09-20 17:13:37
1970
5
原创 Null passed to a callee that requires a non-null argument 【iOS常见报错收集】
此处某参数未设置 _Nullable,但是赋值了nil,xcode自动提示防止nil导致异常;将此处有可能传入nil的参数设置。
2023-02-20 09:16:56
1118
原创 iOS 组件中设置文件支持MRC
使用cocopods 加载此组件时,在 Pods 下的 Build Phases 中的 Compile Sources目录中 找到想要设置的文件,把 Compiler Flags 填写为 -fno-objc-arc。然后再正常使用的别的spec或subspec中依赖这个mrc-support 子组件就可了。
2022-11-10 10:32:34
1207
原创 Mac 连接显示器,外接显示器不出影像
### 1. 现象 - 转换头,连接线已正确连接; - 显示器电源等也亮,且是已有视频信号的状态; - 查看设置--显示器,里面也显示识别出已连接外接显示器### 2. 解决办法显示器支持的 **最高刷新率** 与 **系统设置的刷新率** 不一致的...
2022-08-12 09:14:04
12873
原创 iOS Xcode 打开支持HTTP请求
修改应用程序的Info.plist文件配置,添加字段来打开支持http请求权限```xmlNSAppTransportSecurity NSAllowsArbitraryLoads ```
2022-07-22 18:03:54
2647
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅