美文网首页iOS技术文章
知识小总结三 (区别与联系)☀️

知识小总结三 (区别与联系)☀️

作者: LeaderBiao | 来源:发表于2017-02-10 16:52 被阅读12次

    #include与#import的区别

    • #include 和#import其效果相同,都是查询类中定义的行为(方法);
    • #import不会引起交叉编译,确保头文件只会被导入一次;

    #import 与@class 的区别

    • @class 的表明,只定 义了类的名称,而具体类的行为是未知的,一般用于.h 文件;
    • @class 比#import 编译效率更高。
    • 此外@class 和#import 的主要区别在于解决循环引用的问题。

    @public、@protected、@private 它们的含义与作用

    • @public:对象的实例变量的作用域在任意地方都可以被访问 ;
    • @protected:对象的实例变量作用域在本类和子类都可以被访问 ;
    • @private:实例变量的作用域只能在本类(自身)中访问 .

    深拷贝和浅拷贝的区别

    • 浅复制:两个实例的指针仍指向内存中的同一资源,只复制指针值而不是实际资源;
    • 深复制:不仅复制指针值,还复制指向指针所指向的资源。

    frame和bounds有什么不同?

    • frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
    • bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

    property属性的修饰符的作用

    • getter=getName、setter=setName:设置setter与getter的方法名;
    • readwrite、readonly:设置可供访问级别;
    • assign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题;
    • retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序;
    • copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
    • atomic: 原子性访问,是一种线程保护技术,防止在写未完成的时候被另外一个线程读取,造成数据错误。
    • nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

    weak 和strong的区别

    • 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。

    UIView和 CALayer 的联系和区别?

    • UIView可以响应事件,Layer不可以!
    • 一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性。
    • UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。

    POST和GET的区别是什么?

    GET
    • 提交数据不安全,数据置于请求行,客户端地址栏可见;
    • 提交的数据大小有限
    • 不可以设置书签
    POST
    • 提交数据安全,数据置于消息主体内,客户端不可见
    • 提交的数据大小没有限制
    • 可以设置书签

    OC可以多重继承么?

    • Objective-C 只支持单继承,如果要实现多继承的话,可以通过类别和协议的方法来实现。

    进程与线程的区别?

    在多线程里有


    类别和扩展的区别

    • category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。

    纯代码、xib和Storyboard的优缺点

    手写代码
    • 优势:适合大型项目大规模使用,利于版本管理、追踪改动以及代码合并,代码重用性高
    • 劣势:速度慢,开发周期长,维护代码复杂,自动布局AutoLayout困难
    xib
    • 优势:开发速度快,在版本管理上和纯代码的差异并不是很大,易读易维护
    • 劣势:xib中的设置往往并非最终设置,UI设计会被代码所覆盖
    storyboard
    • 优势:可以看到每个ViewController的布局样式,也可以明确地知道各个ViewController之间的转换关系。代码量少,开发周期短
    • 劣势:多人协作较麻烦

    NSNotification、delegate和KVO

    Delegate,KVO和NSNotification的作用都是类与类之间的通信,与delegate不同的是:
    • 1、KVO和NSNotification都是负责发出通知,剩下的事情就不管了,所以没有返回值;
    • 2、delegate,KVO和NSNotification可以一对多。

    KVO的使用

    • 被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者。
    • 然后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:
      因此观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应。
    • 这些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很 简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。

    NSNotification的使用

    • 这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。
    • 首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName。
    • 然后谁要监听A的变化,就通过[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应。
    • NSNotification的特点呢,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

    iOS中堆和栈的区别

    • 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来讲,释放工作有程序员控制,容易产生memory Leak。

    • 申请大小:
      栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域。可申请空间小。
      堆:是向高地址扩展的数据结构,是不连续的内存区域。可申请空间大。

    • 分配方式:
      堆都是动态分配的 ,动态分配由alloca函数进行分配
      栈的动态分配由编译器进行释放,无需我们手工实现


    继承和类别的联系区别

    • 共同点:都是给一个类进行扩展
    • 区别:
      1.类别是对方法的扩展,不能添加成员变量。继承可以在原来父类的成员变量的基础上,添加新的成员变量
      2.类别只能添加新的方法,不能修改和删除原来的方法。继承可以增加、修改和删除方法。
      3.类别不提倡对原有的方法进行重载。继承可以通过使用super对原来方法进行重载。
      4.类别可以被继承,如果一个父类中定义了类别,那么其子类中也会继承此类别

    NSArray和NSSet的区别

    • NSArray:有序的集合,存储的元素在一个整块的内存中并按序排列
    • NSSet:无序的集合,散列存储。
      如果搜索一个元素,NSSet的效率会比NSArray高。

    用Block和Delegate实现回调的区别

    • delegate运行成本低,block运行成本高。
    • delegate需要把回调代码写到另一个类中,block直接把代码写在方法的后面,更加直观
    • delegate可以一对多,而block只能一对一

    相关文章

      网友评论

        本文标题:知识小总结三 (区别与联系)☀️

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