1. 代理和通知的区别
效率:代理比通知高;
关联:delegate是强关联,委托和代理双方互相知道。通知是弱关联,不需要知道是谁发,也不需要知道是谁接收。
代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成。通知是全局通知。
代理要实现对多个类发出消息可以通过将代理者添加入集合类后遍历,或通过消息转发来实现。
2. 反射
以执行某个方法举例,实质上是发送了一个消息给Runtime,然后Runtime再根据这个Class的字符串名和这个方法的字符串名,去匹配真正相应的方法地址,然后再执行。同样反射就是利用字符串去动态的检测,从而实现运行时的转化。
1、获取Class对象
Class对象其实本质上就是一个结构体,这个结构体中的成员变量还是自己,这种设计方式非常像链表的数据结构。
typedefstructobjc_class *Class;
structobjc_class {
Class isa OBJC_ISA_AVAILABILITY;
}
实例对象获取Class对象
[self class]
类对象获取Class对象
[Person class]
2、反射方法
// SEL和字符串转换
FOUNDATION_EXPORTNSString*NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SELNSSelectorFromString(NSString*aSelectorName);
// Class和字符串转换
FOUNDATION_EXPORTNSString*NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullableNSClassFromString(NSString*aClassName);
// Protocol和字符串转换
FOUNDATION_EXPORTNSString*NSStringFromProtocol(Protocol *proto)NS_AVAILABLE(10_5,2_0);
FOUNDATION_EXPORT Protocol * __nullableNSProtocolFromString(NSString*namestr)NS_AVAILABLE(10_5,2_0);
通过这些方法,我们可以在运行时选择创建那个实例,并动态选择调用哪个方法。
3、常用的判断方法
以下是NSObject提供的基础方法
// 当前对象是否这个类或其子类的实例
- (BOOL)isKindOfClass:(Class)aClass;
四.UIview 和CALayer 的区别
1.UIView相比CALayer最大的区别是UIView继承NSResponse,可以响应用户事件,而CALayer继承与NSObject不可以响应用户的响应事件。
2.UIView侧重对于显示内容的管理,CALayer侧重于对内容的绘制。
3.UIView和CALayer是相互依赖的关系。UIView的显示依赖于CALayer提供的内容。CALayer依赖UIView的容器来显示绘制的内用。
4.UIView来自CALayer,高于CALayer,是CALayer的高层实现与封装。UIView的所有特性来源于CALayer的支持。
五. HTTPS
HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
六. NSOperationQueue
为什么要使用 NSOperation、NSOperationQueue?
1.可添加完成的代码块,在操作完成后执行。
2.添加操作之间的依赖关系,方便的控制执行顺序。
3.设定操作执行的优先级。
4.可以很方便的取消一个操作的执行。
七. Optional
Swift 中,什么可选型(Optional)
在 Swift 中,可选型是为了表达一个变量为空的情况,当一个变量为空,他的值就是 nil
在类型名称后面加个问号? 来定义一个可选型
值类型或者引用类型都可以是可选型变量
varname:String?// 默认为 nilvarage:Int?// 默认为nilprint(name,age)// 打印 nil, nil
八. delegate 和 notification 的区别
1).二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的。
2).notification通过维护一个array,实现一对多消息的转发。
3).delegate需要两者之间必须建立联系,不然没法调用代理的方法;notification不需要两者之间有联系。
九. Instruments
Instruments里面工具很多,常用:
1).Time Profiler:性能分析
2).Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能。
3).Allocations:用来检查内存,写算法的那批人也用这个来检查。
4).Leaks:检查内存,看是否有内存泄露。
十. 循环引用
循环引用出现在当两个实例对象相互拥有强引用关系的时候,这会造成内存泄露,原因是这两个对象都不会被释放。只要一个对象被另一个对象强引用,
那么该对象就不能被释放,由于强引用的存在,每个对象都会保持对方的存在。
解决方式:用weak或者unowned引用代替其中一个的强引用,来打破循环引用。
十一. struct 和 class
在 Swift 中,class 是引用类型(指针类型), struct 是值类型
struct: 值类型
值类型在传递和赋值时将进行复制; 赋值给var、let或者给函数传参,是直接将所有内容拷贝一份, 类似于对文件进行copy、paste操作,产生了全新的文件副本。属于深拷贝(deep copy)
值类型: 比如结构体,枚举,是在栈空间上存储和操作的
class: 引用类型
引用类型只会使用引用对象的一个"指向"; 赋值给var、let或者给函数传参,是将内存地址拷贝一份,类似于制作一个文件的替身(快捷方式、链接),指向的是同一个文件。属于浅拷贝(shallow copy)
引用类型: 比如 Class,是在堆空间上存储和操作的
Class 可以被继承, struct 不能继承
十二. 访问控制关键字 open, public, internal, fileprivate, private 的区别?
Swift 中有个5个级别的访问控制权限,从高到低依次是 open, public, internal, fileprivate, private
它们遵循的基本规则: 高级别的变量不允许被定义为低级别变量的成员变量,比如一个 private 的 class 内部允许包含 public的 String值,反之低级变量可以定义在高级别变量中;
open: 具备最高访问权限,其修饰的类可以和方法,可以在任意 模块中被访问和重写.
public: 权限仅次于 open,和 open 唯一的区别是: 不允许其他模块进行继承、重写
internal: 默认权限, 只允许在当前的模块中访问,可以继承和重写,不允许在其他模块中访问
fileprivate: 修饰的对象只允许在当前的文件中访问;
private: 最低级别访问权限,只允许在定义的作用域内访问