自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(279)
  • 资源 (3)
  • 收藏
  • 关注

原创 isa方法列表测试(含Demo)

isa方法列表测试

2016-08-23 18:40:11 1096

原创 UIView的init与initWithFrame的调用顺序

UIView的init与initWithFrame的调用顺序

2016-08-18 17:40:29 3218 1

原创 UIScrollView高级用法:delaysContentTouches与canCencelContentTouches属性

UIScrollView高级属性,delaysContentTouches,canCencelContentTouches,

2016-08-17 16:20:49 5443 1

原创 iOS卡顿优化

怎么优化下面场景离屏渲染的情况 图层阴影(Shadow):设置图层的 shadowOpacity、shadowOffset、shadowRadius 等属性。图层圆角(Corner Radius):设置图层的 cornerRadius 属性,并同时启用了 masksToBounds。图层蒙版(Mask):设置图层的 mask 属性或使用 maskToBounds。透明度(Opacity):设置视图的 alpha 属性。

2024-07-28 21:03:34 1015

原创 iOS 锁总结(cc)

在C++中,你可以使用来构建一个自定义的自旋锁。这种方法比使用更灵活,因为它允许你存储更复杂的状态或使用更高级的原子操作。C++复制代码12345private:67public:8910// 自旋等待111213141516171819202122// 临界区代码2324实现自旋锁的方法有多种,包括使用系统提供的锁(如)、基于的自定义实现、利用第三方库以及基于信号量的方法。选择哪种方法取决于你的具体需求和项目的约束条件。

2024-07-02 18:25:19 837 2

原创 Swift有什么时候是深拷贝,什么时候是浅拷贝?

在Swift中,你可以使用。

2024-07-01 14:20:28 1113

原创 Flutter:FlutterBoost

FlutterBoost是基于Flutter的Boost库,其实现原理主要包括以下几个方面:1. 引擎复用:FlutterBoost通过复用单个Flutter引擎实例,使得在原生和Flutter之间切换页面时,不需要每次都创建新的引擎实例。这大大提高了页面切换的流畅性和性能。2. 页面栈管理:FlutterBoost内部维护了一个页面栈,用于管理所有的Flutter页面和原生页面。当进行页面跳转时,它会根据页面栈的状态来决定是显示Flutter页面还是原生页面。

2024-06-23 16:51:14 918

原创 KVO原理

需要注意的是,阻止 KVO 可能会违反类的设计意图,并可能导致使用该类的其他代码出现问题。因此,除非有充分的理由,否则通常不建议禁用 KVO。如果你的类是为其他开发者使用的 API 的一部分,最好在设计时就考虑到这一点,并在文档中明确指出哪些属性支持 KVO,哪些不支持。这样,这个属性就不会暴露在类的公共头文件中,外部对象也就不知道这个属性的存在,从而无法对其进行 KVO。此时,可以在类的文档中明确指出某些属性不支持 KVO,并且不保证对这些属性的 KVO 监听会有任何效果。这意味着在属性变化时手动调用。

2024-06-15 17:40:19 996

原创 iOS Category

Category 的主要用途是为现有的类添加新方法,而不是改变类的内部状态或结构。如果允许在 Category 中添加实例变量,那么在运行时对类的内存布局进行修改可能会引起严重的兼容性问题,尤其是对于已经在使用的类实例。如果允许在 Category 中添加实例变量,那么在运行时对类的内存布局进行修改可能会引起严重的兼容性问题,尤其是对于已经在使用的类实例。:如果 Category 能够添加实例变量,当多个 Category 尝试添加同名的实例变量时,冲突和不一致的情况将难以避免。类型添加了一个新的方法。

2024-06-15 17:20:09 1141

原创 消息查找、消息转发机制

代码直观:方法在编译时就已经定义,代码清晰易懂,便于维护。编译时检查:编译器可以对所有方法进行类型检查和语法检查,减少运行时错误。性能:由于方法在编译时已经确定,不需要在运行时进行方法解析,调用速度更快。直接预定义方法适用于插件数量有限且变化不频繁的场景,代码简单直观,性能较好。动态方法解析则适用于需要高扩展性和灵活性的场景,可以在运行时动态添加或修改方法,但增加了代码的复杂性和运行时的性能开销。在实际应用中,可以根据具体需求选择合适的方法。如果插件数量较少且变化不大,直接预定义方法可能更合适。

2024-06-12 18:02:18 918

原创 算法:198 打家劫舍

定义dp[i]为在不触动警报装置的情况下,偷窃到第i个房屋时能够偷窃到的最高金额。

2024-06-12 15:56:51 272

原创 算法:2、两数相加

给你两个的链表,表示两个非负的整数。它们每位数字都是按照的方式存储的,并且每个节点只能存储数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

2024-06-12 13:44:57 304

原创 算法:21.升序链表合并

新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。

2024-06-12 13:06:44 184

原创 iOS Runtime理解和应用场景

第一个参数是需要添加方法的类,第二个参数是一个selector,也就是实例方法的名字,第三个参数是一个IMP类型的变量也就是函数实现,需要传入一个C函数,这个函数至少有两个参数,一个是id self一个是SEL _cmd,第四个参数是函数类型。3)完整的消息转发:当-(void)forwardInvocation:(NSInvocation*)anInvocation 方法方法nil的时候则进入消息转发的最后阶段,完整的消息转发。这里利用runtime修改isa指针,修改调用方法时寻找方法的类。

2024-06-11 18:13:51 1175

原创 算法:11. 盛最多水的容器

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。

2024-06-11 12:42:22 287

原创 oc中类都是在main执行前,加载到内存中的,正确吗?

需要注意的是,Objective-C中的类加载是动态的,这意味着在程序运行时可以动态地创建、修改和销毁类。总结起来,Objective-C中的类是在程序运行时加载到内存中的,而不是在main函数执行前。Objective-C运行时系统会自动加载所有的类,并创建类的元数据,以便在main函数中使用它们。在Objective-C中,类是在程序运行时(runtime)加载到内存中的,而不是在main函数执行前。在Dart和Flutter中,static方法是在类被加载时加载的,并且它们被加载到类的元数据中。

2024-06-10 10:16:23 373 1

原创 iOS不改变frame,能写出一个位移动画

在iOS开发中,如果不想通过直接修改视图的frame属性来实现位移动画,可以使用Core Animation的类或UIView动画块来实现。下面分别展示这两种方法。

2024-06-09 16:41:15 508 1

原创 iOS开发-锚点

在iOS开发的面试中,锚点(Anchor Point)是一个可能涉及的高级主题,尤其是在讨论视图布局、动画和图层(CALayer)相关的内容时。以下是一些关于锚点的面试题,涵盖了基础概念、实际应用以及可能的陷阱和注意事项。

2024-06-09 16:34:53 958

原创 算法:283. 移动零

给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。nums =nums =[0][0]你能尽量减少完成的操作次数吗?

2024-06-07 19:23:14 665

原创 算法:94. 二叉树的中序遍历--扩展前中后层序遍历

给定一个二叉树的根节点root,返回它的遍历。

2024-06-07 18:51:41 280 1

原创 算法:226. 翻转二叉树

给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。

2024-06-07 18:27:19 325

原创 算法:70. 爬楼梯

假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?n = 22有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶n = 33有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶。

2024-06-07 18:16:28 286

原创 iOS开发中copy on write

不可变对象的复制:当对一个不可变对象执行复制操作时,实际上只会创建该对象的引用计数副本,而不会真正复制对象的内容。这样可以节省内存,并提高性能。通过使用Copy-On-Write机制,可以减少不必要的内存复制和内存消耗,提高性能和内存效率。方法复制为NSString时,实际上只会创建一个不可变的NSString对象,而不会复制真正的字符串内容,直到修改其中一个副本为止。方法复制为NSArray时,实际上只会创建一个不可变的NSArray对象,并共享内部的数据结构,直到修改其中一个副本为止。

2024-06-07 10:13:58 191

原创 NSNotificationCenter的底层原理

底层初窥——NSNotificationCenter | 江涛的博客iOS底层系列31 -- Notification的底层原理 - 简书iOS通知底层实现原理

2024-06-06 18:39:39 227

原创 RxSwift-数据双向绑定

RxSwift 是一个用于 iOS 开发的响应式编程库,它提供了一种声明式的方法来处理异步数据流。双向数据绑定(Two-way Data Binding)是 RxSwift 中一个非常有用的特性,它允许视图和模型之间的数据相互同步。虽然 RxSwift 本身没有提供直接的双向数据绑定特性,但我们可以通过一些技巧和 RxSwift 提供的工具来实现这一功能。下面是双向数据绑定的实现原理和一个示例。

2024-06-06 17:10:30 565

原创 算法:101. 对称二叉树

给你一个二叉树的根节点root, 检查它是否轴对称。truefalse[1, 1000]你可以运用递归和迭代两种方法解决这个问题吗?

2024-06-05 13:02:08 243

原创 OC和Swift的区别,发送消息和执行方法的区别

特性Swift方法调用方式消息传递(Message Passing)静态绑定(Static Dispatch)动态绑定(Dynamic Dispatch)灵活性高:运行时确定方法实现低:默认编译时确定方法实现性能较低:运行时查找方法实现有开销较高:编译时确定方法实现类型安全较低:编译时检查较弱较高:编译时类型检查实现动态特性简单:原生支持复杂:需要使用@objc和dynamic关键字运行时特性强大:丰富的运行时库支持较弱:但可以通过@objc和运行时特性扩展常见用途。

2024-06-04 17:12:11 1154

原创 算法:142环形链表第一个节点 II-和【扩展】

一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。空间复杂度:O(N),其中 N 为链表中节点的数目。我们需要将链表中的每个节点都保存在哈希表当中。时间复杂度:O(N),其中 N 为链表中节点的数目。我们恰好需要访问链表中的每一个节点。指针再次到达,则链表中存在环。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,则在该链表中没有环。

2024-06-03 11:45:05 839

原创 oc中synchronized的实现原理

可重入性:OC(以及Java)中的synchronized是可重入的,即一个线程在持有某个对象的锁时,可以再次进入该对象的同步代码块或方法,而不会导致死锁。锁的升级和降级:在某些情况下(如Java中),为了提高性能,锁的状态可能会从偏向锁、轻量级锁升级到重量级锁,或者在竞争降低时降级。在Objective-C(OC)中,synchronized的实现原理主要是基于对象锁(monitor lock)的机制来确保线程安全的。例如,当对象被某个线程持有时,这些位会被设置为特定的值,以表示锁的状态。

2024-06-01 20:06:54 406

原创 算法:二叉树的最大深度

是指从根节点到最远叶子节点的最长路径上的节点数。

2024-05-31 17:35:09 170

原创 算法:102 二叉树的层序遍历和每层最大值

该方法接收一个TreeNode类型的根节点作为参数,并返回一个二维列表List,其中每个内部列表List代表一层节点的值。在每次循环中,首先获取当前层的节点数量levelSize,然后遍历当前层的所有节点。定义数据结构:首先,我们定义了一个TreeNode类来表示二叉树的节点,包含节点的值以及左右子节点的引用。当当前层的所有节点都遍历完毕后,将当前层的节点值列表levelNodes加入结果列表result。// 将当前节点的子节点加入队列。

2024-05-29 23:49:39 381

原创 AutoreleasePool如何实现?

在Objective-C中,AutoreleasePool是由NSAutoreleasePool类实现的。它使用了一个栈结构来管理自动释放池的创建和销毁。

2024-05-29 19:29:39 869

原创 oc中的数据结构在都在什么位置

需要注意的是,Objective-C的数据结构(如对象、数组、字典等)通常是在堆上分配的,而基本数据类型(如int、float、BOOL等)和局部变量则通常是在栈上分配的。全局区(Global Area):全局区也称为未初始化数据段,用于存储全局变量和静态变量的未初始化值。静态存储区(Static Storage Area):静态存储区是用于存储静态变量和全局变量的内存空间。常量区(Constant Area):常量区是用于存储字符串常量和其他常量的内存空间。常量区的数据是只读的,不允许修改。

2024-05-29 16:28:08 977

原创 反转一个链表

在递归过程中,先递归反转当前节点之后的链表,然后将当前节点的下一个节点的next指针指向当前节点,最后将当前节点的next指针设为null,即完成了当前节点的反转。希望这个解答对你有帮助!如果还有其他问题,请随时提问。要反转一个链表,可以使用迭代或递归的方式进行操作。

2024-05-28 19:55:42 172

原创 二叉树的中序遍历

在这个实现中,我们使用了一个栈来辅助遍历过程。我们首先将根节点入栈,并将指针指向其左子节点,然后不断将指针指向的节点入栈,直到指针为null。接着,我们弹出栈顶节点,并访问该节点,然后将指针指向弹出节点的右子节点。在这个实现中,我们使用了递归的方式来进行中序遍历。然后按照中序遍历的顺序依次进行递归遍历左子树、访问当前节点、递归遍历右子树。使用非递归的方式实现二叉树的中序遍历可以借助栈数据结构来辅助遍历过程。你可以根据自己的需要对访问当前节点的操作进行修改,例如输出节点的值或进行其他处理。

2024-05-28 19:54:33 591

原创 是所有的图片都能用Canvas画出来吗?

需要注意的是,Canvas绘制的效果受到图片的大小和画布的大小影响。在绘制时,可以通过设置绘制目标矩形的大小和位置来控制图片的绘制区域和缩放。另外,对于大图或高分辨率图片,可能需要考虑性能和内存消耗的问题。除了以上常见的图片格式,Flutter还支持其他一些特定的图片格式,如ICO、BMP等。在使用Canvas绘制图片时,可以根据图片的格式选择合适的加载器和绘制方法。Canvas不会将图片转换为其他格式进行绘制,它是直接在画布上绘制图片的。Flutter中使用Canvas绘制图片时,可以使用。

2024-05-28 17:42:48 139

原创 WebRTC

WebRTC(Web Real-Time Communication)是一种开放式的实时通信技术,它允许浏览器和移动应用程序之间进行音频、视频和数据的实时通信。它的开放标准和跨平台特性使得WebRTC成为实现实时通信的强大工具。网络游戏和实时互动应用:WebRTC的实时性和低延迟特性使其成为开发实时互动应用和网络游戏的理想选择,如实时多人游戏、实时聊天等。文件传输和数据通信:除了音视频通话,WebRTC还支持实时的数据传输,可以用于传输文件、发送消息和实现其他实时数据通信的需求。

2024-05-28 17:42:16 441

原创 Canvas和WebGL

总结:Canvas适用于2D静态图形和简单动画的绘制,而WebGL适用于实现复杂的3D图形和特效。Canvas使用JavaScript直接控制绘图,而WebGL通过GPU进行高性能的图形渲染。选择使用Canvas还是WebGL取决于具体的需求和应用场景。Canvas和WebGL都是用于在Web浏览器中进行图形渲染的技术,但它们在实现和使用上有一些区别。

2024-05-28 17:25:09 318

原创 Flutter中图片是怎么在flutter上呈现出来的?

需要注意的是,Flutter中的图片渲染过程是高度优化的,并且可以通过使用缓存、异步加载、网络加载优化等技术来提升性能和用户体验。同时,Flutter还提供了丰富的图片处理功能,可以进行圆角裁剪、滤镜效果、颜色混合等操作,以满足各种图片展示需求。组件是一个用于加载和显示图片的Widget,可以从本地文件、网络URL或内存中加载图片,并在应用界面上进行渲染。在Flutter中,图片的呈现是通过使用。

2024-05-28 17:24:10 327 1

原创 怎么不发版,快速支持新功能

需要注意的是,虽然可以通过上述方法来快速支持新功能,但在某些情况下,可能仍然需要进行版本发布,以确保应用的稳定性和用户体验。远程更新:通过应用内的远程更新机制,可以实现对应用的改进和新功能的支持。在应用中集成一个配置管理系统,使得可以根据配置文件的变化,动态调整应用的行为和功能。模块化设计:在应用开发中采用模块化设计的方式,将新功能作为一个独立的模块集成到应用中。功能开关:在应用中添加功能开关逻辑,可以根据用户角色、设备类型或其他条件来决定是否开启新功能。这样可以在应用中灵活控制新功能的展示和使用。

2024-05-28 16:50:05 133

NSRunLoopDemo

runloop相关的代码整理。Timer,CustomSource,DispatchSource,ConfigRunLoop,ObserverRunloop等

2016-09-02

SourceDemo

dispatch_source_create,dispatch_source_set_timer

2016-08-25

Instance of Subclass, Subclass, Instance of Superclass, Superclass,

Instance of Subclass, Subclass, Instance of Superclass, Superclass,及方法直接的关系

2016-08-25

空空如也

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

TA关注的人

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