#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只能一对一