iOS精品文章-面试

17.07月面试问题

2017-07-10  本文已影响26人  41c48b8df394

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方法。

上一篇 下一篇

猜你喜欢

热点阅读