1.深拷贝和浅拷贝的理解?
浅拷贝:只是对指针的拷贝,拷贝后两个指针指向同一个内存空间
深拷贝:不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针
对一个实例进行深拷贝时当前类需要实现NSCopying协议。
浅拷贝是复制出来一个跟原对象是同一地址的对象,而深拷贝则是复制出来一个跟源对象不同地址的对象,改变原对象,对新对象没有影响。
2. 写出方法获取ios内存使用情况。
void logMemoryInfo()
3. 怎样实现一个singleton的类
要实现单例,首先需要一个static的指向类本身的对象,其次需要一个初始化类函数。
1)@synchronized
static InstanceClass *instance; + (InstanceClass *)defaultInstance { @synchronized (self){ if (instance == nil) { instance = [[InstanceClass alloc] init]; } } return instance; }
2)GCD
static InstanceClass *instance; + (InstanceClass *)defaultInstance{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[InstanceClass alloc] init]; }); return instance; }
4. 什么是安全释放?
把对象指针置为nil,再对其释放。
5.RunLoop是什么?
runloop是事件接收和分发机制的一个实现,字面上来说,是线程中的循环
Runloops是线程的基础架构部分。一个runloop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。
每个线程,包括程序的主线程(main thread)都有与之相应的run loop对象
6. 什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
把对象转换为字节序列的过程称为对象的序列化
把字节序列恢复为对象的过程称为对象的反序列化
将对象写到文件或者数据库里,并且可以读取出来
遵循NSCoding协议,来实现复杂对象的存储
实现该协议后就可以对其进行打包或者解包,然后转化为NSData
7.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
#define MIN(A,B) ((A)<(B)?(A):(B))
8. iphone os有没有垃圾回收机制?简单阐述一下OC内存管理。
没有 引用计数机制
1:对你自己拥有的对象负责.你只能释放你拥有的对象.
2:凡是你通过retain,alloc,copy等手段获得了所有权的对象,都必须在你不再使用它的时候,,由你来调 用release,autorelease等手段来释放对它的所有权.
3:在一定的代码段内,对同一个对象所作的copy,alloc和retain的次数应该与autorelease及release的 次数相等;
4:可以在dealloc的方法中释放你所占有的实例变量.
5:对于便利构造器和访问器来说,你没有通过上述的手段获得对象的所有权,因此在这些情况下你无须对 获得的对象进行额外的释放操作.
6:autorelease只不过意味着预定延迟发送一条release信息.当前的引用计数并没有变.
9. 简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
按Home键进入后台:
- (void)applicationWillResignActive:(UIApplication *)application{}
- (void)applicationDidEnterBackground:(UIApplication *)application{}
从后台回到前台:
- (void)applicationWillEnterForeground:(UIApplication *)application{}
- (void)applicationWillResignActive:(UIApplication *)application{}
10.ViewController 的 alloc,loadView,ViewDidLoad,ViewWillAppear,ViewDidUnload,dealloc,init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
alloc:申请内存空间的时候调用.
init:视图初始化的时候,赋一些程序的初始值
LoadView:加载视图的时候调用 self.view != nil的时候,执行loadview,加载一些自己的视图
ViewDidLoad:视图已经加载的时候调用(网络数据之类的,刷新表之类)(添加通知)
ViewWillAppear:视图将要出现的时候
ViewDidUnload:视图已经卸载(数据释放掉)(移除通知)
dealloc:视图已经销毁的时候(self.view = =nil)自己拥有的实例变量释放掉