35. NSOperationQueue 和 GCD 的区别。
NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象。
- GCD仅仅支持FIFO队列,而NSOperationQueue中的队列可以被重新设置优先级,从而实现不同操作的执行顺序调整。
- GCD不支持异步操作之间的依赖关系设置。如果某个操作的依赖另一个操作的数据(生产者-消费者模型是其中之一),使用NSOperationQueue能够按照正确的顺序执行操作。GCD则没有内建的依赖关系支持。
- NSOperationQueue支持KVO,意味着我们可以观察任务的执行状态。
了解以上不同,我们可以从以下角度来定义原则
-
性能
GCD更接近底层,而NSOperationQueue则更高级抽象,所以GCD在追求性能的底层操作来说,是速度最快的。这取决于使用Instruments进行代码性能分析,如有必要的话 -
从异步操作之间的事务性,顺序行,依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持
-
如果异步操作的过程需要更多的被交互和UI呈现出来,NSOperationQueue会是一个更好的选择。底层代码中,任务之间不太互相依赖,而需要更高的并发能力,GCD则更有优势
36.单例
static SharedPerson *_person;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_person = [super allocWithZone:zone];
});
return _person;
}
+ (instancetype)share {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [[self alloc]init];
});
return _person;
}
- (id)copyWithZone:(NSZone *)zone {
return _person;
}
37. ios 多线程——原子、非原子,自旋锁和互斥锁
- nonatomic:非原子属性,线程不安全的,效率高
- atomic:原子属性,线程安全的,效率相对低。
- 原子属性是一种单(线程)写多(线程)读的多线程技术,不过可能会出现脏数据.atomic属性内部的锁称为 自旋锁
凡是线程安全的对象,内部肯定会加锁。
自旋锁和互斥锁
- 相同点:都能保证同一时间只有一个线程访问共享资源。都能保证线程安全。
- 不同点:
- 互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。
- 自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
自旋锁的效率高于互斥锁。
38. 动画.
39. 单例
+(DBManager *)sharedManager{
Static DBManager *manager = nil;
static dispatch_once_t token;
dispatch_once(&token,^{
if(manager == nil){
manager = [[DBManager alloc]init];
}
} );
return manager;
}
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!manager) {
manager = [super allocWithZone:zone]; //确保使用同一块内存地址
return manager;
}
return nil;
}
}