17.07月面试问题

作者: 41c48b8df394 | 来源:发表于2017-07-10 17:59 被阅读26次

    1.封装网络请求
    好处:可以降低网络请求方法与控制器的耦合度,即使网络使用第三方框架发生不兼容,错误等问题从而想换框架时,也不用到每个控制器里面改代码;建立单例工具类,方便管理。优化代码结构。

    1.有没有用过多线程,解释下多线程?
    多线程的作用是:可以解决负载均衡问题,充分利用cpu资源,为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而互不干扰。
    大多情况下,要用到多线程的主要是需要大量的io操作时,或处理的情况需要花大量的时间等等,比如读写文件、视频图像的采集、处理、显示、保存等。

    缺点:大量的线程降低代码的可读性、更多的线程需要更多的内存空间。当多线程对一个资源出现争夺的时候要注意线程安全的问题。

    iOS有三种方法:1.NSThead,2.NSOperation、GCD
    1.NSThead:相比其他两个要轻量级,但是需要手动管理线程的生命周期,线程同步。
    2.NSOperation:
    2.线程同步的方法
    1.@synthsize 3.并行
    2.NSLock :同步代码块 上锁

    AVPlayer来实现播放
    AVPlayerItem负责提供视频信息,AVPlayer负责管理和调控,AVPlayerLayer显示视频,
    首先:得到视频的URL
    根据URL创建AVPlayerItem。
    把AVPlayer提供个AVPlayer
    AVPlayerLayer显示视频。AVPlayer控制视频,播放,暂停,跳转等。

    1.assign可以修饰OC对象么?

    答案:assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针。

    2.delegate的生命周期
    3.A跳转BB跳转C 他们之间的传值你用什么方法传?属性还是代理
    4.关于TableView的内存优化

    1.正确地使用Cell的重用机制
    2.提前计算好cell的高度和布局
    UITableView的回调顺序是先多次调用tableView:heightForRowAtIndexPath:用来确定contentsize及cell的位置,然后才会调用tableView:cellForRowAtIndexPath:,从而来显示当前屏幕的cell。
    iOS9会更厉害,还会华东边调用tableView:heightForRowIndexPath:,可见这个方法里一定不会重复进行大量的计算。我们应该提前计算好车cell的高度并且缓存起来,在回调时直接把高度值直接返回。
    3.避免阻塞主线程
    很多时候我们需要从网络请求图片等,把这些操作放在后台操作,并且缓存起来
    4.按需加载
    5.减少subviews的数量
    6.尽可能重用开销比较大的对象
    NSDateFormatterNSCalendar等对象初始化非常慢,我们可以把它加入类的属性中,或者创建单例来使用
    7.圆角、阴影之类的全部bitmap化,或者放到后台draw好了再拿出来(离屏渲染)
    解决方法:
    1.开启CALayer.shouldRasterize ,转嫁到CPU上;
    2.粗暴画图/截图实现border和圆角;
    8.不要动态的添加或者移除子控件

    如果是较大或者不常用的图片资源,采用imageWithContentsOfFile:。

    5.ARC下关于内存泄露都有哪些?

    1.block的循环引用
    2.NSTimer
    在使用NSTimer addtarget,为了防止target被释放而导致的程序异常,timer会持有target。
    解决方法:使用invalidate方法消掉timer。
    3performSelector系列

    6.A push b b push c为了防止内存泄露可以做哪些?
    7.单例模式是什么?优缺点

    单例模式就是只有一个实例,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。并提供一个全局访问点去访问它。
    优点:
    1.提供了对唯一实例的受控访问;
    2.由于系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要凭和销毁的对象单例模式无疑可以系统的性能
    缺点:
    1.不可以扩展
    2,滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出,如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态丢失。

    8.属性跟成员变量的区别

    1.属性对成员变量扩充了存取方法
    2.属性默认会生带下划线的成员变量

    9.imageNamed和imageWithContentsOfFile

    这个知道的人比较多,因为缓存图片的消耗通常是肉眼可见的多。
    常用的元素例如icon之类的,采用imageNamed:,系统会有缓存。

    10.归档有哪些方法?

    1.plist
    2.NSUsererDefaults

    NSUsererDefaults可以保持个nil么?可以

    12

    上拉刷新下拉加载的实现原理

    1.下拉刷新实际上是监测UIScrollView的contentOffset的Y值,当他往下拉动时,UIScrollView的contentOffset是一个减小的,然后把通过动画把它的contentInset值控制成一个定值,然后通过设置延时把UIScrollView的contentInset的值恢复到原点。
    2.上拉加载其实原理和下拉刷新基本是一样的,只不过判断的contentOffset的值不同,如果scrollView.bounds.size.height+scrollView.contentOffset.y>scrollView.contentSize.height,说明你执行了上拉操作。

    block的实现一个带参数的
    获取2个数的最大公约数。或者最小公倍数

    最大公约数的两个算法

    有两整数a和b:

    ① a%b得余数c

    ② 若c=0,则b即为两数的最大公约数

    ③ 若c≠0,则a=b,b=c,再回去执行①
    OC

    //相除法
    -(NSInteger)commonNumber{
        NSInteger fenzi = a>b ? a: b;
        for (NSInteger i = fenzi; i>=0; i--) {
            if (a%i==0&b%i==0) {
                return i;
            }
        }
        
        return 1;
    }
    

    swift(不会用swift的for循环从大到小,怪折腾的...)

       func ssCommonNumber()->NSInteger
        {
            var a = NSInteger()
            
            var b = NSInteger()
            a = 12
            b = 18
            var fenzi = NSInteger()
            fenzi = a > b ? a : b
            
            for i in ((0 + 1)...fenzi).reversed() {
                
                let c = a % i
                let d = b % i
                if (c == 0) && (d == 0){
                    return i
                }
            }
            
            return 1
        }
    
    

    有两整数a和b:

    ① 若a>b,则a=a-b

    ② 若a<b,则b=b-a

    ③ 若a=b,则a(或b)即为两数的最大公约数

    ④ 若a≠b,则再回去执行①
    OC

    //相减法
    -(void)addWithCommonNumber{
        
        while (a!=b) {
            if (a>b) {
                a = a-b;
            }else{
                b = b- a;
            }
        }
        NSLog(@"相减法得到最大公约数是:%ld",a);
        
    }
    

    swift

        func CommonNumber()->NSInteger
        {
            var a = NSInteger()
            
            var b = NSInteger()
            a = 12
            b = 18
            while a != b {
                if a>b {
                    a=a - b
                    
                }else{
                    b = b - a;
                }
            }
            return a;
        }
    
    

    最小公倍数

    两个数相乘除以最大公约数就是最小公倍数

    MVC、MVVM、MVP的区别

    models-负责主要的数据或者操作数据的数据访问层
    views-负责展示层
    contorller、presenter、ViewModel-负责协调model和view,通常会根据用户在view上的动作在model上作出对应的更改,同时将更改的信息返回到view上。
    MVC优缺点
    苹果官方给出的优缺点
    优点:
    1.同时开发-多个开发人员可以在模型,控制器和视图上同时工作。
    2.高凝聚力-MVC可以在控制器上进行相关的动作的逻辑分组。特定模型的视图也会分组在一起
    3.低耦合-MVC框架的本质就是模型、视图或控制器之间的耦合度较低
    4.易于修改-由于责任分离,未来的开发或修改更容易
    5.模型的多个视图-模型可以有多个视图

    缺点:
    1.代码导航-框架导航可能是复杂的,因为它引入了新的抽象层,并要求用户适应MVC的分解标准。
    2.多工件一致性-将一个特性分解为三个工件导致散射,因此,要求开放人员一次维护多个表示的一致性。
    3.显著的学习曲线-多种技术的支持成为标准。使用mvc的开发人员需要精通多种技术。

    工厂模式

    其实就是创建对象

    UIButton到NSObject的类

    UIButton->UIControl->UIView->UIReponder->NSObject

    category为什么不能添加属性?

    一个类中用@property声明属性。编译器会自动帮我们生成成员变量和setter/getter,单分类的指针结构体中,根本没有属性列表,所以分类中用@property声明属性,既无法生产成员变量也无法生成setter/getter。
    因为OC是动态语言,方法真正的实现是通过runtime完成的,我们可以通过runtime手动添加setter/getter方法。

    相关文章

      网友评论

        本文标题:17.07月面试问题

        本文链接:https://www.haomeiwen.com/subject/lffuhxtx.html