自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 iOS面试:如何手动触发一个value的KVO?

在 iOS 开发中,手动触发一个属性的 KVO(Key-Value Observing)更新,通常是在属性的值在代码中发生变化时,确保观察者能够收到这些变化的通知。虽然 KVO 通常是在观察某些属性变化时自动通知观察者的,但如果你在代码中直接设置属性值,而没有调用 KVO 的相关方法,观察者将不会察觉到这些变化。方法,你可以手动触发 KVO 通知,确保观察者得知属性的变化。这种方式不仅遵循 KVO 的规范,同时还能有效触发对属性变化的观察反应。属性,你希望在修改该属性时手动通知观察者。

2024-09-07 09:45:00 533

原创 iOS面试:addObserver:forKeyPath:options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调?

类型的指针,用于传递任何必要的上下文信息到观察者。通常用于在观察者中区分不同的观察(如:观察同一个对象的不同时刻)或传递状态。这个参数是一个字符串,指定了要观察的属性的键路径。方法来处理这些变化。在实际工作中,正确使用 KVO 可以实现灵活的响应式编程模式,增强应用程序的动态内容更新能力。这个参数指定了观察者对象,也就是当所监控的属性发生变化时,会接收到通知的对象。方法进行 KVO 注册,能够让观察者在某个对象的指定属性发生变化时获得通知。: 发生变化的对象,即你所观察的对象。: 指示被观察的属性的路径。

2024-09-06 09:00:00 571

原创 iOS面试:dispatch_barrier_async的作用是什么?

是 Grand Central Dispatch (GCD) 中的重要函数,主要用于并发队列中,以确保在某些特定情况下的线程安全和操作顺序。是一个强大的工具,用于管理并发队列中的读写操作,防止数据竞争,并保证操作的顺序。当没有写权限的操作并行执行时,性能会更高。例如,先进行多个数据读取操作,然后再执行一次数据写入操作,这样可以保证写操作是最后被执行的。在并发队列中,当有读(读取数据)和写(修改数据)的操作时,可能会导致数据的不一致性。在写操作完成后,后续的读取任务可以继续执行,这确保了数据的完整性。

2024-09-05 09:15:00 322

原创 iOS面试:如何用GCD同步若干个异步调用?

在 iOS 开发中,使用 Grand Central Dispatch (GCD) 可以方便地处理异步任务并在所有任务完成后执行后续操作。要同步若干个异步调用,例如根据多个 URL 异步加载多张图片,并在所有图片加载完成后合成一张整图,我们可以使用。,你可以有效地管理一组异步操作,并在所有操作完成后进行后续操作(如合成整图)。设置一个回调,当所有下载任务都完成时,它会在主线程中执行指定的合并操作。等待所有任务完成,并在所有任务完成后执行合并操作。发起异步下载任务,在完成回调中处理下载逻辑。

2024-09-04 09:15:00 338

原创 iOS面试:GCD的队列(dispatch_queue_t)分哪两种类型?

简单来说,GCD 的队列主要分为两种类型:串行队列和并行队列。串行队列按顺序一个接一个地执行任务,而并行队列则允许多个任务同时执行。:虽然不直接被列为串行队列或并行队列,主队列实际上是一个特殊的串行队列。并行队列允许同时执行多个任务。任务的执行顺序并不确定,具体的执行顺序取决于系统的调度。是 GCD 中的一个重要对象,用于管理和调度要执行的任务。在这个例子中,我们使用了一个全局的并行队列,所有提交到这个队列的任务可以并行执行,从而提高效率。是一个串行队列,所有提交到这个队列的任务将会按照顺序逐个执行。

2024-09-03 09:00:00 744

原创 iOS面试:使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?

的动画方法)时,通常需要考虑引用循环(retain cycle)的问题。引用循环指的是两个或多个对象互相持有对方的强引用,导致内存不能被正确释放,从而造成内存泄漏。)的引用时,需要谨慎考虑并使用弱引用来避免这种潜在的问题。的动画方法)时,虽然在某些情况下不会直接造成引用循环,但在包含对类实例(如。没有捕获任何外部变量或对象的强引用,通常不会引发引用循环的问题。在这些情况下,为了确保不引发引用循环,建议始终使用。仍然保持强引用,从而导致的引用循环。),则可能会引发引用循环。的时候,这种情况是可能出现的。

2024-09-02 09:15:00 439

原创 iOS面试:使用block时什么情况会发生引用循环,如何解决?

因此,了解引用循环的原理和解决方式是每个 iOS 开发者必备的技能。时容易出现引用循环(retain cycle)的情况,这会导致内存泄漏。作为一名 iOS 开发工程师,我将详细解释什么情况下会发生引用循环,以及如何解决这个问题。引用循环是指两个或多个对象通过强引用彼此持有,导致对象之间形成了强引用关系,从而无法被系统释放,造成内存泄漏。被用作该对象的属性或方法参数,会形成强引用循环。时,特别要注意可能发生的引用循环。的引用变成弱引用,从而打破强引用关系。,不需要持有,可以直接使用。

2024-09-01 10:00:00 597

原创 iOS面试:在block内如何修改block外部变量?

在多线程环境中,直接修改外部变量可能引发竞争条件(race condition)。此外,为了保持代码的安全和可读性,尤其是在多线程环境中,应考虑对变量的线程安全性。内部想要修改外部变量时,必须遵循一些规则。是一种在封装了执行代码的结构,用于处理异步操作、回调等场景。将捕获外部变量的值(即强引用),因此无法直接修改该变量。中对外部变量进行修改,以满足具体的业务需求。内部修改外部变量,最简单的方法是使用。中修改外部变量时,最佳实践是使用。在这个示例中,我们定义了一个。修饰符,使变量的值能够在。

2024-09-01 10:00:00 346

原创 iOS面试:BAD_ACCESS在什么情况下出现?

错误通常是因为访问了已释放的内存或未初始化的对象。在调试时,可以使用 Xcode 的 Address Sanitizer,它可以帮助检测内存访问错误。使用了 ARC 的情况下,可能不小心使得拥有该对象的引用变为 nil 后又想使用它。如果持有指向某个对象的指针,但该对象已被释放且未设为 nil,使用这个指针会导致。当你尝试访问一个没有被初始化的对象或者未设置为指向有效内存的指针时,也会出现。在多线程编程中,若一个线程释放了对象,另一个线程继续使用该对象,也会导致。在访问对象之前,确保对象是否有效。

2024-08-31 10:00:00 844

原创 iOS面试:苹果是如何实现autoreleasepool的?

是 Cocoa 和 Cocoa Touch 框架中内存管理的重要组成部分,负责自动释放在其作用范围内创建的对象。时,该类会创建一个新的池对象。这个池对象会维护一个数组或链表,记录所注册的所有对象。当代码块执行完毕后,该池会被销毁,所有在池内注册的对象将会被释放。有助于降低内存峰值,尤其在需要频繁创建对象的循环中,通过在每个循环中嵌套。而当池被解除时,内部实现会遍历记录的对象,并调用它们的。每个嵌套的池都会维护自己的对象列表,最内层的池将首先释放其对象。中注册,当这个池被销毁时,所有注册的对象都会被释放。

2024-08-31 10:00:00 510

原创 iOS面试:ARC通过什么方式帮助开发者管理内存?

总而言之,ARC 通过自动插入内存管理代码、引入强引用和弱引用的概念、处理自动释放池以及通过编译器帮助开发者避免内存泄漏,简化了内存管理过程。自动引用计数(ARC)是 Objective-C 的一种内存管理机制,它通过编译器在编译阶段插入适当的内存管理代码,从而帮助开发者管理内存。对象在该块的作用域结束时会被自动释放,这在处理大量临时对象时非常有用,比如在循环中创建的对象。:默认情况下,所有对象引用都是强引用,这意味着只要存在强引用,ARC 将不会释放该对象。修饰符,这表示该引用不会增加对象的引用计数。

2024-08-30 10:00:00 401

原创 iOS面试:不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)

完成执行后,该自动释放池不会立即释放刚创建的对象,而是等到事件循环的处理结束。当事件循环处理 UI 事件时,会创建一个新的自动释放池并在处理结束时释放其中的对象。的对象时,这个对象的释放时机依赖于自动释放池(autorelease pool)如何被管理。被调用时,通常是在视图控制器即将显示其视图之前,这意味着该方法的调用发生在一个新的事件循环周期中。的范围内使用,但在方法返回并进入主事件循环处理后,它可能已经被释放。标记的对象一旦超出该方法的作用域后,会被加入到当前的自动释放池中。总之,如果不手动指定。

2024-08-30 10:00:00 303

原创 iOS面试:runloop内部是如何实现的?

的内部实现对于开发者优化应用程序的响应能力和性能是非常重要的。这种机制不仅支撑了 UI 事件的处理,还管理了后台任务和其他必要的系统活动。是一个强大的工具,可以有效管理应用程序的事件循环。它的底层使用输入源和定时器来调度事件,同时支持多种运行模式。输入源可以是自定义的,或是系统提供的。在处理输入源时,可以通过 callback 函数来执行具体的逻辑。会检查所有的输入源和定时器,决定哪个可以被处理。对象,并配置输入源、定时器和其他支持的模式。等,这决定了哪些事件和输入会被处理。就会唤醒并处理对应的输入源。

2024-08-29 10:00:00 367

原创 iOS面试:objc使用什么机制管理对象内存?

总结来说,Objective-C 的内存管理主要依赖于引用计数机制,通过手动管理和自动管理(即 ARC)来实现。ARC 并不是完全“自动”的,开发者仍然需要理解对象的引用周期,确保不会创建循环引用。在使用 ARC 的过程中,开发者需要特别注意可能的循环引用问题,尤其是在使用闭包、委托等场景中。这种机制要求开发者对每个对象的生命周期进行仔细管理,以防止内存泄漏(没有适当释放对象)和野指针(使用已经释放的对象)。,但在被引用的对象不再存在时,会导致崩溃,适用于开发者确保引用的对象在使用期间始终存在的情况。

2024-08-29 10:00:00 333

原创 iOS面试:runloop的mode作用是什么?

的模式在 iOS 中起着重要的作用,提供了一种机制来隔离和控制事件源的处理。通过合理使用不同的模式和输入源,我们能够更高效地管理应用的执行和事件处理,从而提高用户体验和应用性能。在某些情况下,比如在进行复杂计算或其他长时间运行的任务时,可能希望阻止 UI 更新和用户交互。每种模式都有不同的输入源和定时器,它们可以定义在该模式下运行时运行的事件。模式共享的输入源(如定时器),这样在多个不同的模式下,你可以使得它们保持活跃。为一个只处理必要事件的模式,以避免频繁的 UI 更新,进而提升性能。

2024-08-28 10:00:00 453

原创 iOS面试:以+ scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

创建的定时器(NSTimer)在滑动页面上的列表时可能会出现回调暂停的现象。在这个模式下,只有与用户交互相关的事件会被处理,定时器通常会被暂停,因为它们是在。如果你需要在不同的模式下手动管理定时器,可以在滑动开始和结束时手动添加或移除定时器。是一个专门用于与屏幕刷新同步的定时器,适合处理动画和高频率的更新。模式,这样它就可以在多个模式下运行,包括滑动时的。,可以确保它在滑动时继续工作。),这会导致定时器的回调被暂停。时,定时器的回调不会被触发。的模式,而在滑动列表时,当用户在滑动列表时,

2024-08-28 10:00:00 431

原创 iOS面试:能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?

这种动态的灵活性使得 Objective-C 在处理复杂的情况时非常强大,例如在使用插件架构、网络请求响应模型等场合,这种动态生成类和添加实例变量的能力可以实现更多的功能,增强代码的可扩展性。: Objective-C 和 Swift 都是静态类型语言,编译器在编译时就会检查类型的正确性,加上类的实例变量在二进制文件中的布局是不可变的,因此编译后无法添加新的实例变量。在 iOS 开发中,关于向已编译的类中添加实例变量及向运行时创建的类中添加实例变量的问题,答案是有所区别的。向运行时创建的类中添加实例变量。

2024-08-27 10:00:00 268

原创 iOS面试:runloop和线程有什么关系?

每个线程都有自己的执行栈和程序计数器,并且线程共享进程的内存空间。iOS 中可以创建和管理多个线程,以便同时执行多个任务,提高应用的性能和响应能力。在实际开发中,当需要在后台线程中执行一些长时间运行的操作,并且希望能够处理定时器或其他事件,可以使用。为线程提供了一个时间轮询的机制,以确保能够处理多种输入源,而不会导致 CPU 资源的浪费。这样,开发者可以在主线程中处理 UI 事件,同时在后台线程中执行耗时任务。,我们可以有效管理多线程环境中的任务和事件,提高程序的整体效率。是默认运行的,而后台线程的。

2024-08-27 10:00:00 454

原创 iOS面试资料集合

本文主要收集了一些iOS面试资料,包含面试课程(5门)、面试题(158题)、面试书籍(3本)

2024-08-26 10:00:00 3739

原创 iOS面试:runtime如何实现weak变量的自动置nil?

这种机制不仅提高了内存管理的安全性,还减少了开发者在处理对象生命周期时的复杂性。在底层实现上,Objective-C 运行时使用了一个称为“弱引用表”的数据结构。这个表会在对象释放时被检查,以便找到所有指向该对象的。当一个对象的引用计数(retain count)降到零时,运行时会执行对象的析构过程。: 当对象的引用计数降为零时,运行时会触发对象的释放过程。在这个过程中,运行时会遍历所有指向该对象的。变量是一种引用类型,它不会增加对象的引用计数。变量被设置为指向该对象时,运行时会将该引用添加到弱引用表中。

2024-08-26 09:00:00 554

原创 iOS面试:_objc_msgForward 函数是做什么的,直接调用它将会发生什么?

是 Objective-C 中实现消息发送机制的一个底层函数。它的主要作用是响应对象接收到的消息时,处理未实现的方法(即方法未被找到的情况)。下面是对其功能的详细解释以及直接调用它所导致的后果。

2024-08-25 09:15:00 311

原创 iOS面试:runtime如何实现weak变量的自动置nil?

在 iOS 开发中,weak变量的自动置nil是 Objective-C 和 Swift 中内存管理的重要特性。这个特性主要依赖于 Objective-C 的运行时(runtime)机制。

2024-08-25 09:15:00 372

原创 iOS面试:RunLoop 底层原理是怎么实现的?

它可以看作是一个循环,允许线程在空闲时等待事件(如用户输入、定时器触发等),并在事件到来时进行处理。每个线程都有自己的 RunLoop,主线程的 RunLoop 用于响应 UI 事件,而其他线程的 RunLoop 常用于后台任务。不同模式下的输入源可以在 RunLoop 中被激活,这使得开发者能够灵活处理不同的事件,如 UI 更新和用户输入。可以在后台线程创建 RunLoop,并注册任务或输入源以处理特定的事件。当启动 RunLoop 时,可以注册输入源,RunLoop 进入一个循环等待事件的发生。

2024-08-24 14:15:00 353

原创 iOS面试:isa 里边存储的是什么?

这使得运行时可以确定对象的类型和关联的类,从而可以根据类的信息来调用对应的方法和访问属性。通过动态添加方法到已有类,可以扩展对象的能力,这些方法的调用同样通过。这意味着在运行时可以动态地添加或修改类方法和实例方法,以及在类中添加新的属性和协议。在 Objective-C 和 Swift 中,每个对象都有一个指向它的类的引用,这个引用存储在对象的。可以被认为是一个指向结构体的指针,该结构体包含了类的信息,包括方法列表、实例变量、类的父类信息等。存储的是指向它的类的引用。指针,编译器和运行时可以确保类型安全。

2024-08-24 09:15:00 338

原创 iOS面试:KVO原理,是怎么找到中间类的?

KVO 是基于 runtime 机制实现的,当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法(KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类)。

2024-08-23 14:15:00 219

原创 iOS面试:9、为什么Category 不能添加属性,为什么还要设计ro,直接添加不是很方便么,如果将flag改变ro能不能写入,改变了会怎样?

在一个分类中添加了一个属性,Xcode 不会自动的为其生成一个下划线开头的成员变量及 set和get方法,如果你没有手动的实现这两个方法,直接在外面通过点语法调用这个属性,肯定就直接挂了,Unrecognised selector send to instance,因为他压根就没有这两个方法,所以当你真的在分类中声明了一个属性的时候,就要手动的去实现这个属性的set和get方法,这个时候就要用到运行时机制了,关联上去这个属性的存取过程。ro是为了存储编译后的类的内存结构,直接加会改变内存结构。

2024-08-23 09:15:00 226

原创 iOS面试:从页面A跳转到页面B内存里面会发生什么?

从页面 A 跳转到页面 B 触发了一系列的内存管理和生命周期管理事件,包括对象的创建、视图的加载、内存的分配和释放等。页面 A 的视图控制器的引用计数会减少,当没有强引用时,页面 A 及其相关视图可能会被释放。比如在 UINavigationController 中,页面 A 的视图控制器会被压入栈中,允许后续返回。在 iOS 应用中,从页面 A 跳转到页面 B 时,内存中会发生一系列的变化,涉及到对象的生命周期、内存管理和视觉组件的准备。),这些数据也会被保存在内存中,直到视图控制器 B 被释放。

2024-08-22 14:15:00 188

原创 iOS面试:SDWeblmage的底层实现

SDWebImage 是一个高效且易于使用的图片加载和缓存库,它通过异步加载、内存和磁盘缓存、图像处理等机制,确保了在网络环境中的高效运行。SDWebImage 是一个非常流行的 iOS 图片加载和缓存库,旨在简化图像的异步下载及缓存过程。SDWebImage 采用了可插拔的架构,以支持自定义的图像处理器,或者替换网络请求的实现。处理后,图像会被存入缓存。SDWebImage 还会管理下载状态,比如通过 Block 回调来处理成功或失败的状态,并能够取消未完成的请求,避免重复加载已经在进行中的请求。

2024-08-22 09:15:00 373

原创 iOS面试:delloc的强用顺序?

的调用顺序和合适的清理方式是内存管理的重要组成部分,尤其是在复杂对象之间相互引用的情况下。在使用 ARC 的情况下,虽然大部分内存管理工作由系统处理,但开发者仍需关注资源的清理和状态的恢复。方法是释放对象内存的关键方法。当对象被销毁时,系统会调用此方法,允许开发者在对象销毁前执行一些必要的清理工作。接着,释放在子类中定义的成员变量和其他关联资源。可能会导致循环引用,因此尽量避免在该方法中访问对象的属性。(在非ARC环境中)或直接返回(在ARC环境中)来完成的。的时候,不会有其他线程访问正在被释放的对象。

2024-08-21 14:15:00 401

原创 iOS面试:iOS 启动是做了什么操作?

iOS应用的启动过程涉及从创建进程到加载可执行文件,再到初始化UI的多个重要环节。开发者应关注在应用启动时的耗时操作,合理管理资源和初始化逻辑,以提升用户体验。此时,会为应用分配内存,并进行基本的资源初始化。在这个方法中,开发者可以进行应用的初始配置,比如设置根视图控制器、初始资源加载等。在iOS应用启动过程中,系统执行了一系列重要的操作。系统读取应用的 Info.plist 文件,获取配置信息,如应用名称、版本、权限等。如果应用在后台被唤醒,系统会处理相关的逻辑,比如恢复应用的状态。

2024-08-21 09:15:00 364

原创 iOS面试:iOS 主线程具体在什么时候创建的?

这个线程负责管理UI相关的任务,并且是所有用户交互事件的处理线程。因此,开发者需要确保所有UI相关的操作都在主线程中进行,以避免潜在的线程安全问题。iOS的UI操作和许多其他系统任务都仅在主线程上执行,确保线程安全。在这个阶段,主线程被创建并启动,处理Application的事件,包括UI更新和用户交互。此时,初始化UI相关的组件(如窗口和视图)也会在主线程上进行。在iOS中,主线程(通常称为UI线程)是在应用程序启动过程中创建的。当用户启动一个iOS应用时,iOS系统会为该应用分配一个新的进程。

2024-08-20 14:15:00 270

原创 iOS面试:启动阶段需要加载很多动态该怎么去优化耗时?

在iOS应用的启动阶段,如果需要加载大量动态内容,优化启动耗时是至关重要的。只在需要时加载动态内容。可以在用户交互后(例如用户滚动到某个区域)再进行数据加载,而不是在启动时就全部加载。利用 App Thinning 技术,确保应用只下载与用户设备相关的架构和资源,从而提升启动速度。在启动时,尽量减少主线程的计算和处理任务,例如通过将复杂的计算移至后台线程。在应用启动之前,可以从本地存储或云端预加载关键数据,以减少启动时的等待时间。:审视应用启动时加载的资源,去除冗余的代码、图片和资产。

2024-08-20 09:15:00 308

原创 iOS面试:怎么去实现全局app的点击事件埋点

许多第三方分析工具(如 Google Analytics、Mixpanel、Firebase Analytics 等)提供了集成方法,可以更简单地实现事件跟踪。实现全局点击事件埋点的方法有很多,具体使用哪种方法取决于项目的需要和代码结构是否易于维护。最重要的是,确保事件捕捉的准确性和系统的性能。在iOS开发中,实现全局应用的点击事件埋点可以通过多种方法。如果你的应用使用了很多自定义的按钮,可以创建一个继承自。的自定义按钮类,在其中处理点击事件并记录埋点信息。类,重写点击事件的方法,并在其中添加埋点逻辑。

2024-08-19 10:39:33 300

原创 iOS面试:什么时候用mvc,mvp,mvvm?

在iOS开发中,选择架构模式(MVC、MVP、MVVM)通常取决于项目的需求、团队的熟悉程度以及维护的方便性。适合需要保持UI与业务逻辑分离的复杂应用,尤其是在使用SwiftUI时,MVVM模式非常自然。选择合适的架构模式非常重要,应综合考虑团队的技能水平、项目复杂度以及未来的维护需求。由于UIKit的设计根植于MVC,很多UIKit的组件天然适配这种模式,简单易用。更好地支持单元测试,Presenter的逻辑可以独立于View进行测试。更好的解耦,增强可测试性,ViewModel可独立于视图进行测试。

2024-08-19 10:08:33 255

空空如也

空空如也

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

TA关注的人

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