3月7日 面试ios工程师面试题

1.浅拷贝和深拷贝的区别?

浅拷贝:对指向对象的指针进行拷贝
深拷贝:直接拷贝对象到内存中一块区域,然后把新对象的指针指向这块内存

遵循NSCopying协议的可以使用浅拷贝,遵循NSMutbaleCopying协议的可以使用深拷贝。(没有遵循协议进行使用会发生异常)。

系统非容器类对象(NSString这样的)
不可变对象调用copy或mutbalecopy符合深拷贝浅拷贝定义。
可变对象调用Copy和MutableCopy方法都会重新分配一块内存。但是copy和mutableCopy的区别在于copy在复制对象的时候其实是返回了一个不可变对象,因此当调用方法改变对象的时候会崩溃

系统容器类对象(NSArray这样的)
不可变对象:容器对象和非容器对象在分别调用Copy和MutableCopy时没有什么分别,不可变对象调用Copy方法只是增加了对原对象的指针的引用,调用MutableCopy方法是重新分配一块内存,然后把新对象指向新内存。
可变对象:而对于可变对象不管调用Copy还是MutableCopy都是新分配一块内存。但是虽然重新分配了一块内存,但是对象里面的数据依然是指针复制的,下面我们来看一段代码:
对于系统容器类对象,其元素对象始终是指针复制。(理由是原对象改变值不管是调用copy还是mutablecopy,其上面的值都会跟着改变)。

2.简述OC中内存管理机制。readonly、assign、copy、strong、weak属性的作用?什么情况下用?

readonly此标记说明属性只可以读,也就是不能设置,可以获取。readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变
assign不会使引用计数加1,也就是直接赋值。assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
copy 建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
strong:打开ARC时才会使用,相当于retain。
weak:打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil

3.反向传值怎样做,常用几种方法。参考文章:http://blog.csdn.net/shi520fu/article/details/61194541

4.ios的沙河目录结构是怎样的?参考文章:http://blog.csdn.net/wzzvictory/article/details/18269713

1、MyApp.app
2、Documents
3、Documents/Inbox
4Library
5Library/Caches
6Library/Preferences
7、tmp

5.GCD与NSOperation的区别。参考文章:https://www.jianshu.com/p/d09e2638eb27

GCD 技术是一个轻量的,底层实现隐藏的神奇技术,我们能够通过GCD和block轻松实现多线程编程,有时候,GCD相比其他系统提供的多线程方法更加有效,当然,有时候GCD不是最佳选择,另一个多线程编程的技术 NSOprationQueue 让我们能够将后台线程以队列方式依序执行,并提供更多操作的入口,这和 GCD 的实现有些类似。

GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;

作者:王小明if
链接:https://www.jianshu.com/p/d09e2638eb27
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

6.代理和Block的区别。

blockdelegate 都可以通知外面。block 更轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据,使用 block 的代码通常会在同一个地方,这样读代码也连贯。delegate 更重一些,需要实现接口,它的方法分离开来,很多时候需要存储一些临时数据,另外相关的代码会被分离到各处,没有 block 好读。应该优先使用 block。而有两个情况可以考虑 delegate1. 有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。比如一个网络类,假如只有成功和失败两种情况,每个方法可以设计成单独 block。但假如存在多个方法,比如有成功、失败、缓存、https 验证,网络进度等等,这种情况下,delegate 就要比 block 要好。

作者:黄兢成
链接:https://www.zhihu.com/question/29023547/answer/109570584
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

应用范围:
如果这个回调是一个不定期触发,或者会多次触发的,那么 Delegation 应该更适合;如果这个回调是一个一次性的,并且和调用方法是单线性关系的,那么 Block 应该更适合;如果这个回调是广播性质的,需要很多个不同的类都接收到,那么 NSNotification 更适合。在不同的执行线(不是线程),不同的执行次数、执行数量上的区别,是鉴别使用哪一种回调的最好判断方法。

作者:Bill Cheng
链接:https://www.zhihu.com/question/29023547/answer/110199052
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

7.UITableview的优化方法。
8.runloop和线程有什么关系?主线程默认开启了runloop?子线程呢?
9.进程和线程的区别?
10.冒泡排序。

NSMutableArray *arr_M = [NSMutableArray arrayWithObjects:@1,@4,@2,@3,@5,nil];

    //遍历`数组的个数`次
    /*
     i = 0 的时候,j的相邻两个位置都要比较排一下位置:
         j = 0 的时候:arr_M = 41235
         j = 1 的时候:arr_M = 42135
         j = 2 的时候:arr_M = 42315
         j = 3 的时候:arr_M = 42351

     i = 1;
      ……  ……
     */
    for (int i = 0; i < arr_M.count; ++i) {

        //遍历数组的每一个`索引`(不包括最后一个,因为比较的是j+1for (int j = 0; j < arr_M.count-1; ++j) {

            //根据索引的`相邻两位`进行`比较`
            if (arr_M[j] < arr_M[j+1]) {

                [arr_M exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }

        }
    }

    NSLog(@"最终结果:%@",arr_M);

作者:Se7ven
链接:https://www.jianshu.com/p/a466e9033dd2
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

11.做过地图(百度地图)上面的Baidu Logo如何消掉。
12.Block传值如何让变量有效?
13.通知如何传多个值?
14.环信的聊天组等等如何保持长时间运行不断线(用socket长连接)。

你可能感兴趣的:(PHP,知识储备,ios,内存管理)