iOS 基础知识

1. 值传递和引用传递的区别?


所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。

所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变

2.浅复制和深复制的区别?


浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。

iOS 基础知识_第1张图片
修改newString,会不会影响oldstring?
iOS 基础知识_第2张图片
两个字符串地址没有变,但是内容不一样.

深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

3.沙盒中的各个目录在实际开发中如何使用?


Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。

AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

Library 目录:这个目录下有两个子目录:

Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.

Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。

可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。

tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。

4.了解哪些加密方式?


MD5 和 Base64加密  

MD5主要特点是不可逆,相同的数据的MD5值肯定一样,不同数据的MD5值不一样(也不是绝对的,但基本是不可能一样的)。由于MD5加密算法具有较好的安全性,而且免费,因此盖加密算法被广泛使用大多数的登录功能向后台提交密码时都会使用到这个算法。

Base64 

Base64是一种数据编码方式,目的是让数据符合传输协议的要求。标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。

3DES 

3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。

5.简单说明多线程技术的优点和缺点?


多线程介绍

多线程的优点

              能适当提高程序的执行效率

              能适当提高资源利用率(CPU、内存利用率)

多线程的缺点

              开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能

              线程越多,CPU在调度线程上的开销就越大

              程序设计更加复杂:比如线程之间的通信、多线程的数据共享

6.NSThread线程的几种状态,并说明状态转换的逻辑?


线程的状态

NSThread线程有: 线程的创建、线程的开启、线程的运行和阻塞、线程的死亡。

7.图片进行二级缓存的实现思路?


在显示图片的时候,先检查该图片对应的内存缓存,如果内存缓存中没有,则继续检查该图片对应的磁盘缓存是否存在,如果存在磁盘缓存,则先保存一份到内存缓存中(方便下次使用)然后设置并显示图片,如果不存在磁盘缓存,则直接下载该图片,下载完成后保存一份到内存缓存中保存一份到磁盘缓存中,设置并显示图片.

8.NSRunloop和线程的关系?


多线程和NSRunLoop概述 

每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后去run它。一般情况下我们是没有必要去启用线程的RunLoop的,除非你在一个单独的线程中需要长久的检测某个事件。

9.objc_msgSend作用?


 objc_msgSend介绍  

在对象上调用方法是Objective-C中经常使用的功能。用Objective-C的术语来说,这叫做“传递消息”(pass a message)。消息有“名称”(name)或“选择子”(selector),可以接受参数,而且可能还有返回值。objc_msgSend函数会依据接收者与选择子的类型来调用适当的方法。

iOS 基础知识_第3张图片
给R对象的setAge:方法传参20,输出为20

10.objc_property_t作用?


iOS 基础知识_第4张图片
获取派生类的属性个数及属性类型
iOS 基础知识_第5张图片
获取到的属性名及属性类型

运行时Runtime详细介绍

Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。上面介绍这两个都属于runtime的知识内容。

11.load和+initialize的区别是什么?


load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

12.静态库和动态库的区别, 以及对应的应用场景?


静态库:

当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中。这就会导致最终生成的可执行代码量相对变多,相当于编译器将代码补充完整了,这样运行起来相对就快些。不过会有个缺点:占用磁盘和内存空间. 静态库会被添加到和它连接的每个程序中, 而且这些程序运行时, 都会被加载到内存中. 无形中又多消耗了更多的内存空间.

应用场景:

       方便共享代码,便于合理使用。

       实现iOS程序的模块化。可以把固定的业务模块化成静态库。

       和别人分享你的代码库,但不想让别人看到你代码的实现。


动态库:

动态库在程序编译时并不会被连接到目标代码中,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

iOS静态库SDK制作(包含第三方静态库)

13.说明NSCache的特点?


1)NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存

2)苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)    建议:接收到内存警告时主动调用removeAllObject方法释放对象

3)NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁

4)NSCache的Key只是对对象进行Strong引用,不是拷贝,在清理的时候计算的是实际大小而不是引用的大小

14.SDWebImage框架内部在清理磁盘缓存的时候clearDisk方法和cleanDisk方法有什么区别?


clearDisk:直接把整个缓存文件删除,删除之后创建一个新的空文件;

cleanDisk:先删除过期的缓存文件,然后计算当前剩余缓存文件的大小,如果该数值超过设定的最大缓存大小,那么久安全文件创建的时间从远到近依次删除,直到整个剩余缓存文件大小小于设定的最大缓存大小为止。

15.程序启动的完整过程?


1.main函数

2.UIApplicationMain

* 创建UIApplication对象

* 创建UIApplication的delegate对象

3.delegate对象开始处理(监听)系统事件(没有storyboard)

* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

* 创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口

16.视图生命周期?


viewController叫做视图控制器。对内是用于管理视图,对外则是与其他的viewcontroller进行通信。它继承于NSObject。它分为两种类型,一种叫contentViewController,内容视图控制器,主要用于体现内容

如UITableView

UIViewController这种直接显示内容的;还有一种叫做containerViewController,容器视图类。典型的就是tabBar,和navigation.它还包含好几个其它的viewController.

每个view都有一个viewController。且view的生命周期也在viewController里面。所以在view释放之前,viewcontroller是不可以释放的。

step1:initWithNib    viewController会进行alloc,并init.

step2: loadView在这里会看它的子类是否有重写这个函数,如果重写了则调用子类的,否则就调用她自己的。注意,这个时候视图还是没有没加载进来的哦。

step3:viewDidLoad这个时候视图已经存在了。可以在这里添加你想要添加的UI控件了。

step4:viewWillAppear视图将出现在屏幕上了

step5:viewDidAppear视图已经成功在屏幕上渲染完成了

step6:viewWillDisappear视图将要消失了

step7:viewDidDisappear视图从屏幕上消失了

step8:viewDidUnLoad当发生内存警告的时候,如果本视图不是当前正在显示的视图,则会执行这个函数。将子视图释放。

step9:dealloc释放viewController

而view的生命周期则是step3——step8.

viewController的生命周期就是step1——step9

你可能感兴趣的:(iOS 基础知识)