iOS面试题二

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,allocretain的次数应该与autoreleaserelease的         次数相等;

    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)自己拥有的实例变量释放掉





    


你可能感兴趣的:(ios,面试)