一、核心概念1. RunLoop
RunLoop 是线程的事件处理循环,是 NSRunLoop 和 CFRunLoopRef 的封装。
默认只在主线程自动启动。
管理事件源(Timer、Input Source、Observer)。
保持线程活跃、延迟执行任务、监听输入等都依赖 RunLoop。
2. 多线程
iOS 支持多线程方式有:
NSThread
GCD(主流)
NSOperati...
🔗 LeetCode 160 - Intersection of Two Linked Lists
📌 题目描述给你两个单链表的头节点 headA 和 headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。
示例:
1234567A: a1 → a2↘c1 → c2 → c3↗B: b1 → b2 → b3输出:c1
💡 解题思...
一、iOS内存泄漏排查1. 常见内存泄漏场景
循环引用:对象之间相互强引用(如父子对象、Block捕获self未使用weak修饰),导致无法释放516。
未释放Core Foundation对象:使用CF框架(如CFArrayRef、CGImageRef)时未调用CFRelease17。
NSTimer/CADisplayLink强引用:未在适当时机调用invalidate,导致持...
OOM内存泄漏,难以监控。内存泄漏是指程序在运行过程中,由于设计错误或者代码实现不当,导致程序未能释放已经不再使用的内存,从而造成系统内存的浪费,严重的会导致程序崩溃。内存泄漏是一个非常严重的问题,因为它会导致程序运行速度变慢,甚至会导致程序崩溃。因此,我们在开发过程中,一定要注意内存泄漏的问题。
OOM(Out Of Memory)指的是iOS设备上应用因内存占用过高被系统强制终止的现象。...
内存管理引用计数iOS的Objective-C和Swift运行时使用引用计数来管理对象的生命周期。新建对象时引用计数+1,指针指向对象时+1,指针不再指向对象时-1,当引用计数为0时对象被销毁。
TaggedPointer为小型数据(如NSNumber、NSDate、NSString等)提供的一种内存节省技术。TaggedPointer是一个特别的指针,它分为两部分:一部分直接保存数据,另一...
🔗 LeetCode 104 - Maximum Depth of Binary Tree
📌 题目描述给定一个二叉树,找出其最大深度。
最大深度是从根节点到最远叶子节点的最长路径上的节点数。
示例:
123输入:[3,9,20,null,null,15,7]输出:3解释:最大路径是 3 -> 20 -> 7
💡 解题思路我们可以使用 递归 或 BFS 层序遍历 ...
一、ARC 的本质(Automatic Reference Counting)ARC 是编译器级别的内存管理机制,由 Clang 编译器在编译时插入 retain/release/autorelease 相关的代码。
核心机制
每个对象都有一个 引用计数(retain count)。
强引用(strong)+1(retain),释放 -1(release)。
引用计数为 ...
问题概述iOS系统中App卡死崩溃问题无成熟解决方案,因iOS封闭生态,App层面无权限获取卡死崩溃日志。用户通常不会等待卡死超过20s,且手动关闭应用不生成日志,导致监控困难。基于卡顿监控,但难以区分轻微卡顿与严重卡死,且性能损耗大,存在误导性。
崩溃日志格式,如Exception Type: EXC_CRASH (SIGKILL)等,指出App因watchdog超时而被终止。watchd...
基本概念在iOS和macOS中,RunLoop是一个循环机制,用于管理线程中的事件处理。当一个线程启动后,系统会为其创建一个RunLoop,它会不断地运行、检查和处理事件。如果没有事件需要处理,RunLoop会让线程进入休眠状态,从而节省系统资源。
获取当前线程的RunLoop
1NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
这段代码获取...
使用缓存在 iOS 上使用 NSCache 可以有效减少主线程上的工作负担,特别是在需要频繁访问和重复计算的情况下。以下是一个简单的 SwiftUI 示例,展示如何在应用中使用 NSCache 来缓存图像以减少加载时间和主线程的负担。
示例代码:
1234567891011121314151617181920212223242526272829303132333435363738394041...