1.什么是自动释放池,它是如何工作的?当您向对象发送自动释放消息时,Cocoa会将对该对象的引用放入专用的自动释放池中。它仍然是一个有效的对象,因此自动释放池定义的范围内的其他对象可以向它发送消息。当程序执行到作用域末尾时,autoreleasepool会被释放,pool中的所有对象都会被释放。2.再说一下static关键字(1)函数体中static变量的函数作用域是函数体。与auto变量不同的是,该变量的内存只分配一次,所以下次调用时它的值仍会保持上一次的值;(2)模块中的静态全局变量可以被模块内使用的函数访问,但不能被模块外的其他函数访问;(3)模块中的静态函数只能被本模块中的其他函数调用。函数的使用范围仅限于声明它的模块;(4)类中的静态成员变量属于整个类,类的所有对象只有一份;(5)类中的静态成员函数属于整个类所拥有,该函数不接收this指针,因此只能访问类的静态成员变量。3.什么是单例实例?Foundation和ApplicationKit框架中的一些类只允许创建单例对象,即这些类在当前进程中的唯一实例。例如,NSFileManager和NSWorkspace类在使用时都是基于进程的单例对象实例化。当请求这些类的实例时,它们会向您传递对单个实例的引用,如果该实例尚不存在,则首先分配并初始化该实例。单例对象作为控制中心,负责指挥或协调类的各种服务。如果类在概念上只有一个实例(比如NSWorkspace),它应该产生一个单例实例而不是多个实例;如果以后可能有多个实例,可以使用单例实例机制,而不是工厂方法或函数。4、说说Objective-C的优缺点。objc的优点:1)Cateogies2)Posing3)动态识别4)索引计算5)灵活的消息传递6)不是过于复杂的C派生语言7)Objective-C和C++混合编程的不足:1)不支持命名空间2)不支持运算符重载3)不支持多重继承4)使用动态运行时类型,所有方法都是函数调用,所以很多编译时优化的方法都没有用到。(如内联函数等),性能差。5、#import和#include的区别,@class代表什么?@class一般用在类的实例变量需要在头文件中声明的时候。m文件中仍然需要使用#import,#import相对于#include的优势在于不会造成重复包含6、线程和进程的区别?进程和线程都是操作系统实现程序运行的基本单位,系统就是通过这个基本单位来实现系统对应用程序的并发。进程和线程之间的主要区别在于它们是管理操作系统资源的不同方式。一个进程有独立的地址空间。一个进程崩溃后,不会影响保护模式下的其他进程,线程只是一个进程中不同的执行路径。线程有自己的栈和局部变量,但线程之间没有单独的地址空间。一个线程的死亡意味着整个进程的死亡,所以多进程程序比多线程程序更健壮,但是在进程间切换时,消耗的资源更大,效率更低。但是对于一些需要同时执行和共享某些变量的并发操作,只能使用线程,不能使用进程。7.Objective-C的内存管理?1、当你使用new、alloc和copy方法创建一个对象时,该对象的retentioncounter值为1。当你不再使用该对象时,你负责向该对象发送一个release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。2.当你通过任何其他方法获取一个对象时,假设该对象的retaincounter值为1,并且已经设置为自动释放,那么你不需要做任何事情来确保该对象被清理。如果您打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。3.如果你保留一个对象,你需要(最终)释放或自动释放这个对象。retain方法和release方法必须同等使用。8、属性readwrite、readonly、assign、retain、copy、nonatomic的作用是什么,在什么情况下使用?readwrite是可读可写的特性;当需要生成getter方法和setter方法时,readonly是只读特性,只生成getter方法,不生成setter方法;您不希望属性在类外发生变化。assign是赋值特性,setter方法会传入参数Assign给一个实例变量;仅在设置变量时;retain表示持有属性,setter方法会先保留传入的参数,然后再赋值,传入参数的retaincount会+1;copy表示赋值属性,setter方法会将传入的对象复制一份;当需要新变量的完整副本时。nonatomic非原子操作,判断编译器生成的settergetter是否为原子操作。atomic表示多线程安全,一般使用nonatomic
