赞
踩
1 为什么block要用copy修饰?
答:因为block在创建的时候,它的内存是分配在栈上的,而不是在堆区。栈区的特点是:对象随时有可能被销毁,一旦被销毁,在调用时就会造成崩溃。所以我们要使用copy吧它拷贝到堆区。
2 什么是离屏渲染以及离屏渲染的影响?
答:如果要在显示屏幕上述显示内容,我们至少需要一块屏幕一样大小的frame buffer(帧缓冲区),作为像素数据的储存区域,然后由显示器把帧缓存区的数据显示到屏幕上。如果有时因为一些限制比如:阴影,遮罩mask等,造成GPU无法把渲染的结果直接写入frame buffer中,而是先把中间的一个临时的状态存在另外的内存区域,之后在写入frame buffer,这个过程被称之为离屏渲染。离屏渲染的影响:需要额外的开辟内存,增大内存的消耗。需要多次切换上下文,从当前屏切换带离屏,从离屏切换到当前屏,上下文的切换是耗时的,可能会引起掉帧。
3 说说你对ro,rw,rwe的理解?
答:ro是在编译的时候的生成的。当类在编译的时候,类的属性,协议,方法。这些内容就存在ro这个解构题中,这是一个纯净的内存空间。不允许修改。
rw是在运行的时候生成的。它把ro的内容拷贝进去。实现访问类的方法,属性等内容访问rw中里面的的内容。修改也是修改里面的内容。
rwe的设计是为了节省内存。rwe只有添加分类且分类都为非懒加载类,汇总或通过runtime动态修改类的信息的时候才会存在。
4为什么要三次握手和四次挥手?
答:三次握手:为了防止失效的链接请求报文突然又传到了服务器,因为产生了错误,假设这是一个早已失传的报文段。但server收到此失效的请求报文后,就向为client发出的确认报文,同时建立链接,假设不采用三次握手,那么只要server发出确认,新的链接就建立了。由于现在的client并没有发出建立连接的的请求,因此不会理睬server的确认,也不会发送数据,但是server却以为是新的连接已经建立,并一直等待client发来的数据,这样,server的很多资源就白白浪费了。
四次挥手:因为tcp是双向通信的,在接收到客服端的关闭请求是,还有可能在向客户端发送数据,因此不能再回应关闭的请求时,同时发送关闭的请求。
5 http与https的区别?
答:1. http是明文传输的安全性较差,https数据传输过程是加密的,安全性较好
2. https协议需要到申请证书,一般免费的证书较少,需要付费。
3.http比https传输快,因为http使用三次握手建立连接的时候,客服端和服务器需要传输3个包,https需要还要加上ssl握手的需要的9个包,所以一个12个包。
4.http和https的连接方式完全不一样,连接的端口也不一样一个是80,https是443。
5.https其实就是建立在SSL/TLSS上的http协议,所以https比http更耗服务器资源。
6 谈一谈mvc与mvvm?
答:MVC:M是数据模型model,负责处理数据,以及数据改变是发出通知(notifuration,KVO),Moddel和View不能直接进行通信,这样会违背MVC设计模式。V是视图View,用来显示界面和用户进行交互,为了解耦一般不会直接持有或者操作数据层中的数据模型可以通过target-action,delegate,block等方式解耦;C是控制器Controller用来调节model和view之间的交互,可以直接与model,view进行通信,操作model进行数据更新,刷新view。优点:view,model低耦合,高复用,容易维护。缺点:大的交互界面controller的代码过于臃肿。
MVVM是MVC的一种演进,促使了UI代码和业务代码的分离,抽取controller中的逻辑代码放到Viewmodel中。M:数据模型model,V:就是view,vuew和controller都不能直接引用model,可引用viewmodel。controller尽量不能涉及业务逻辑,让viewmodel区处理,controller只是一个中间人,负责view的事件,调用viewmodel的方法,响应viewmodel的变化。vm:viewmodel负责业务逻辑,网络请求。使用viewmodel会增加代码,但是总体上减少了代码的复杂性。viewmodel之间可以依赖。优点:低耦合,可复用,数据流向清晰,而且兼容MVC便于代码的移植,并且viewmodel可以拆出来独立开发,方便测试。缺点:类会增大,viewmodel会越来越庞大,调用的复杂度增加,双向绑定会导致调式变的困难。注意:view引用viewmodel,但反过来不行,因为VM跟v
产生了耦合,不方便复用,viewmodel可以引用model但是反过来不行。
总结:mvvm其实就mvc的变种,mvvm只是mvc帮controller瘦身,把逻辑代码和网络请求分离出来。不让controller处理更多的东西,不会变得臃肿,mvc与mvvm按需进行灵活的选择。mvvm在使用使用双向绑定的技术,是的model变化是view自动变化。需要学习额外的响应式编程。
7 成员变量和属性的区别,以及不同关键字的作用?
答:成员变量 默认是@protected,不会自动生成set和get方法,需要手动实现,不能通过点语法调用,只能->调用。属性 会自动生成带下划线的成员变量,set和get方法,可以通过点语法调用实际是调用set和get方法,注意分类中的属性没有set和get方法,必须自己手动实现。实例变量是与class初始化出来的对象是实例对象。
访问关键字: public声明公共的实例变量,任何地方到可以访问。private私有的变量只有当前类可以访问子类调用需要使用父类的set和get访问。
8 类簇?
答:类簇是Foundation框架中广泛使用的设计模式。类簇在公共抽象超类下对多个私有的具体子类进行分组。以这种方式对类进行分组简化了面对对象框架的公共可见体系结构,二不会降低其功能的丰富度。类簇是基于抽象工厂设计模式的。常见的类簇有个nsstring,nsarray,nsdictionary等,以数组为例,不管创建可变还是不可变的数组在alloc之后得到是一个__NSPlaceholderArray.而当我们init一个可变的数组之后,得到的_NSArrayO;如果有且只有一个元素,那就是__NSSingleObjectArrayI;有多个元素叫__NSArrayI;init出来可变数组是__NSArrayM;
优点:1可以抽象基类背后的复杂细节隐藏起来。2程序员不需要记住各种创建的具体类实现,简化了开发成本,提高了开发效率。3便于进行封装和组件化,4减少了if-else这样缺乏扩展性的代码。5增加新功能支持不影响其他代码。缺点:已有的类簇不好拓展。
运用场景:出现bug是可以通过崩溃报告的关键字,快速定位bug的位置。在实现一下固定且不需要修改的事物是,可以高效的选择使用类簇。例:针对不同版本,不同机型往往需要不同设置,这时可以选择使用类簇。app的设置页面,这种往往不需要经常修改可以使用类簇区创建大量的重复布局代码。
8 常用的设计模式?
答:单例模式: 在整个应用程序中共享一份资源。保证在程序运行过程中一个类只有一个实例对象,提供一个全局的访问点供外界访问,从而方便控制实例个数,节约系统资源。优点:提供一个且唯一的实例对象避免频繁的创建和销毁。缺点:延迟了生命周期,一直占用资源。如果两个单例循环依赖会造成死锁,所以尽量不去产生单例之间的依赖关系。
工厂方法模式:通过类继承创建抽象的产品,创建一个产品,子类创建并重载工厂方法以创建新产品。
抽象工厂模式:通过对象组合创建抽象产品,可以创建多系列产品,必须修改父类的接口才能支持新的产品。
代理模式:代理用来吃了事件的监听和参数传递,使用前先判断方法是否实现。避免找不到方法而崩溃。
装饰模式:在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能例:分类。
享元模式:使用共享的物件,减少同一个类对象的大量创建。如:uitableviewcell的复用。
观察者模式:其本质是一种发布-订阅模型。用来消除有不同行为对象之间的耦合,通过这一模式,不同对象可以协调工作。比如:kvo
命令模式:是一种将方法调用封装对象的设计模式,在ios中具体实现为NSInvocation。
9 GCD与NSOperation区别?
答:1GCD的核心是C语言写的系统服务,执行和操作简单高效,因此NSOperation是通过GCD实现,换个说法就是GCD更高层次的抽象,这是他们之间做本质区别。因此如果希望自定义任务,建议使用NSOperation;2 依赖关系NSOperation可以
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。