今天第一次面试遇到的问题:
1.SDWebimage的好处:图片的缓存,
2.AFN和ASI的区别:ASI是继承于CFNetwork框架,AFN是继承于NSUrl
3.单列模式的要考虑的问题:时间和空间,线程安全的问题:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
#import <Foundation/Foundation.h> @interface Singleton : NSObject +(Singleton *) getInstance;
@end @implementation Singleton
+(Singleton *) getInstance { static Singleton *sharedSingleton_ = nil; @synchronized(self){ if(sharedSingleton_ == nil){ sharedSingleton_ = [NSAllocateObject([self class], 0, NULL) init]; } } return sharedSingleton_; } + (id) allocWithZone:(NSZone *)zone { return [[self getInstance] retain]; } - (id) copyWithZone:(NSZone*)zone { return self; } - (id) retain { return self; } - (NSUInteger) retainCount { return NSUIntegerMax; }
//oneway用在分布式对象的API,这些API可以在不同的线程,甚至是不同的程序。oneway关键字只用在返回类型为void的消息定义中, 因为oneway是异步的,其消息预计不会立即返回。
-(oneway void)release
{
[super release];
}
- (id) autorelease
{
return self;
}
@end
当然,ios 5以上启用ARC就简单多了:
static RootViewController* sharedRootController = nil; +(RootViewController *) sharedController{ @synchronized(self){ if (sharedRootController == nil) { sharedRootController = [[self alloc] init]; } } return singleController; }
1、时间和空间
比较上面两种写法:
懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。
2、线程安全
(1)从线程安全性上讲,不加同步的懒汉式是线程不安全的,比如,有两个线程,一个是线程A,一个是线程B,它们同时调用getInstance方法,那就可能导致并发问题。如下示例:
3.kvo的实现原理:
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
KVO其实也是“观察者”设计模式的一种应用。我的看法是,这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。
4.kvc的原理:
KVC是Key Value Coding的缩写,意思是键值编码。在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象的属性方法。说的有的拗口,实际上就是通过类定义我们可以看到类的各种属性,那么使用属性的名称我们就能访问到类实例化后的对象的这个属性值。