美文网首页
iOS开发 常见知识(一)

iOS开发 常见知识(一)

作者: 落霞与孤鹜齐飞i | 来源:发表于2024-05-09 15:52 被阅读0次

1、 KVO的原理

在iOS开发中,可以使用KVO来监听对象属性的变化,当属性值发生变化时会收到通知。KVO的原理是基于oc的runtime机制,当我们添加一个观察者监测某个属性时,系统会动态生成一个子类,并重写对应属性的setter方法,在setter方法中插入通知触发的逻辑。这样,当属性值发生改变时,系统会发送通知给观察者。

2.KVC的原理

KVC的原理是基于oc的runtime机制,当使用KVC访问对象属性时,首先通过对象的指针找到该对象的类,然后根据传入的key字符串在类的方法列表中查找对应的getter方法。如果找到了相应的getter方法,就会调用该方法获取属性值

在设置属性值时,KVC同样会通过类的方法列表查找对应的setter方法。如果找到了setter方法,就会调用该方法进行属性设置;

通过这种方式,KVC可以实现在不直接调用属性的getter和setter方法的情况下,通过键值对访问和修改对象的属性值

KVO与KVC有什么联系

KVC(键值编码)和KVO(键值观察)是Objective-C中的两个重要机制,它们之间有一定的联系,同时也有一定的区别。

KVC是一种通过字符串访问对象属性的机制,它允许我们使用字符串来获取和设置对象的属性,而不需要显式地调用对象的getter和setter方法。KVC的核心是通过key来访问对象的属性,即通过字符串访问对象的属性。

KVO则是一种观察者模式的实现,它允许一个对象监听另一个对象的某个属性的变化,并在该属性发生变化时自动得到通知。在iOS开发中,我们通常使用KVO来实现对于UI控件的响应、数据模型的观察等场景。

3、AutoreleasePool简介

AutoreleasePool(自动释放池),延迟加入释放池中的变量release的时机,正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入释放池,那么release将延迟执行,延迟释放池使用场景:降低内存峰值

4、OC和Swift的区别

Objective-C和Swift是iOS开发中常用的两种编程语言,它们之间有以下区别

1.语法:OC是一种基于C语言的面向对象编程语言,语法较为繁琐,包括繁多的方括号和冒号。而Swift则更加简洁,语法更加现代化,更符合开发者直观的思维方式。

2.安全性:Swift在设计上更加安全,包括空值处理、类型推断等特性,可以减少开发中的常见错误。Objective-C相对较为灵活,但也容易发生一些潜在的问题。

3.Swift是苹果官方推荐的语言,它与Objective-C可以无缝集成,因此在项目中可以同时使用两种语言并且相互调用。

5.http htpps的区别

1.HTTP的特点 无连接:Http有一个建立连接和释放连接的过程,client发送请求后,都需要有一个建立连接和释放连接的过程(解决方案:HTTP持久连接)2.无状态:多次发送Http请求,如果是同一用户,server端是无法知道(解决方案:cookie/session)

6.get post的区别

GET和POST是HTTP请求方法,用于向服务器发送请求并获取或提交数据的方式,他们主要区别:参数传递位置:GET请求将参数以查询字符串的形式附加在URL后面,参数传递限制:GET请求的参数传递长度有限制,一般约为2KB~4KB,超过长度会被截断,因此适合传递少量数据。而POST请求没有参数长度的限制,适合传递大量数据或敏感信息。安全性:由于GET请求将参数暴露在URL中,可能会被截获,因此不适合传递敏感信息。而POST请求将参数放在body中传递,相对安全一些。总的来说,GET适合用于获取数据,对参数长度有限制;而POST适合用于提交数据,传递大量或敏感信息。在iOS开发中,根据实际需求选择合适的请求方法来进行数据交互。

7.iOS中为什么代理需要用weak修饰

在iOS开发中,代理通常需要使用weak修饰,主要是为了避免循环引用导致的内存泄漏。循环引用是指两个对象相互持有对方的强引用,导致两者无法被释放,从而造成内存泄漏。当一个对象作为另一个对象的代理时,通常会相互持有对方的引用,如果这两个引用都是强引用,就会形成循环引用,无法释放内存。

使用weak修饰代理属性可以打破这种循环引用,weak引用不会增加引用计数,当代理被释放时,代理属性会自动被置为nil,避免循环引用导致的内存泄漏问题。

8.Block为什么要用copy修饰

由于Block可能在定义时保存了局部变量或对象的引用,如果Block在定义后延迟执行时,这些局部变量或对象已经被销毁,那么在Block执行时就会访问到已经释放的内存空间,导致程序崩溃。因此,为了避免这种问题,Block需要使用copy修饰。

使用copy修饰Block会将其从栈区复制到堆区,这样就能保证在Block执行时,其所依赖的对象和变量的引用不会因为作用域的改变而失效。具体来说,当Block被复制到堆区时,其所依赖的对象和变量也会被一并复制到堆区,这样就能保证在Block执行时,其所依赖的对象和变量的引用是有效的。

9.什么是Block

Block是一种用于封装一段代码的数据类型。Block实际上是一个匿名函数,它可以捕获一些变量和常量,并将它们封装在一起,形成一个可以在需要时执行的代码块。Block可以被当作一个对象来使用,它可以作为方法参数、成员变量、局部变量、数组元素等等。Block中捕获的变量和常量被保存在Block中,可以在Block执行时使用。

在使用Block时,需要注意以下几点:

Block中捕获的变量需要在Block执行时仍然存在。如果Block中捕获的变量是局部变量,那么需要使用__block修饰符来使其在Block执行时仍然存在。

Block中使用的变量需要正确地被引用。如果Block中使用了对象,那么需要使用strong或weak修饰符来指定对该对象的引用方式。如果Block中使用了基本数据类型的变量,则不需要使用修饰符。

Block可以作为参数传递给方法或函数,也可以在方法或函数中定义。如果Block作为参数传递给方法或函数,则需要使用^符号定义。

总之,Block是一种非常强大和灵活的数据类型,它可以用于封装一段代码,并将其当做一个对象来使用。Block可以捕获变量和常量,并且可以作为参数传递给方法或函数,在实际开发中非常常用。

10.iOS是如何实现APNs的

iOS通过苹果提供的远程通知服务(APNs)来实现推送通知功能。当应用程序注册APNs并获得设备的设备标识符(Device Token)后,应用程序服务器就可以向APNs发送推送通知请求。APNs会根据设备标识符将推送通知发送到特定的设备上,然后设备收到通知并显示在通知栏或弹出通知界面。

11.谈谈对内存管理的理解

在iOS中,主要采用了自动引用计数ARC的机制来进行内存管理。

在使用ARC时,需要注意以下几点:

对象的引用关系需要正确地维护。如果对象被多个变量引用,那么需要确保所有引用都正确地被处理。对象的循环引用需要避免。循环引用会导致对象无法被正确地释放,从而导致内存泄漏。对象的生命周期需要正确地管理。对象在不再被使用时应该及时释放,以便及时回收内存资源。

12.为什么Block使用了__block,就可以修改block内部的变量

__block修饰符标记后,block就会访问标记变量本身内存地址,而未标记对象则访问截获拷贝后的变量的内存地址

13.category分类

分类是在不可修改原始类的情况下对类的功能进行扩展。分类允许您向已有的类中添加新的方法,但不能添加新的实例变量。分类中的方法会覆盖原始类中同名的方法。分类是在运行时声明的,因此可以动态添加到现有类中。

在Objective-C中,分类是一种用来扩展现有类的功能的机制。虽然分类可以添加新的方法来扩展类的行为,但却无法添加新的实例变量或属性。这是因为在Objective-C中,对象的内存布局是在编译时确定的,对象的内存大小是固定的,实例变量的存储空间是根据类定义的时候确定的。当类被编译后,实例变量的布局已经确定,无法在运行时动态添加。

虽然Objective-C 2.0引入了关联对象(Associated Objects)的概念,允许在运行时为对象添加关联的属性,但这些属性不是真正意义上的实例变量,而是通过运行时机制动态关联的。

因此,分类无法直接添加实例变量或属性,但可以通过其它方式来实现同样的功能,比如使用关联对象或者通过方法来模拟属性的行为。在Objective-C中,通常使用扩展(Extension)来添加实例变量和属性,因为扩展是在编译时就确定类的大小和布局,可以直接添加实例变量和属性。

14.swift中的分类和oc的区别

在Swift中,类似于Objective-C的分类的功能被称为扩展(extension)。虽然分类和扩展在功能上有相似之处,但在Swift中有一些区别:

在Objective-C中,分类无法添加属性,而在Swift中的扩展可以添加计算型属性,但不能添加存储属性。如果需要添加存储属性,可以使用关联对象来模拟。

当我们在Swift中使用扩展时,我们可以添加计算型属性,但不能添加存储属性。这意味着我们只能定义getter和setter,而不能直接在扩展中存储属性值。

15.请说一下对 CALayer 的认识。

layer 主要负责内容的绘制和动画处理,它无法直接的处理触摸事件

16.谈谈对单例模式的理解

单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在 iOS 开发中,单例模式通常用于管理全局的唯一资源或对象。实现单例模式的关键是通过类方法获取单例实例,并保证其唯一性,避免重复创建实例,节省资源和内存

17.谈一谈对runtime的理解

runtime是iOS开发中的一个重要概念,它是一个运行时库,通过它我们可以在程序运行时动态地创建类、调用方法、添加实例变量等。使用runtime可以实现一些常规情况下无法实现的功能,比如方法的交换、动态添加属性、获取类的成员变量列表等。在iOS开发中,runtime常常用于实现一些高级功能,比如字典转模型、方法的动态替换、消息转发等

18. 深拷贝和浅拷贝的概念

深拷贝内存拷贝 浅拷贝指针拷贝

浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用

深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”

19.为什么不能再子线程中刷新UI

因为UIKit框架不是线程安全的,UI刷新操作必须在主线程进行,否则可能导致UI显示异常和应用崩溃。

例如:如果在后台线程移除了一个view,这个时候runloop周期还没有完结,用户在主线程点击了这个“将要”消失的view,那么究竟该不该响应事件?在哪条线程进行响应?

20.说一下MVC

MVC是Model - View - Controller的简称,即模型 - 视图 - 控制器,一般在我们开发中,将APP拆分为三部分逻辑组成。每一部分逻辑都是互相独立的,使用这种模式,使的设计中各部分逻辑清晰,Model负责管理应用程序的数据。视图负责显示应用界面。控制器负责接收用户交互并相应地更新模型和视图

相关文章

网友评论

      本文标题:iOS开发 常见知识(一)

      本文链接:https://www.haomeiwen.com/subject/ynslfjtx.html