//标准的单例写法
//以创建歌曲的管理者为例进行创建。
+(instancetype) sharedQYSongManager
{
static
QYSongsManager *songManager =nil;
//采用GDC标准单例实现方法
static dispatch_once_t onceToken;
//Executes a block object once and only once for the lifetime of an application.
dispatch_once(&onceToken,^{
songManager =[[self alloc] init];
});
return songManager;
}
创建完成后songManager即为单例的对象,即在内存中不管alloc多少个对象都是指的是同一个对象。
有几点需要说明:
1.instancetype是什么?
苹果官方给出的解释是:Use the instancetype keyword as the return type of methods that return an instance of the class they are called on (or a subclass of that class). These methods include alloc, init, and class factory methods.
//iOS开发:CLang添加了一个新的关键字:instancetype;这是一个上下文相关的关键字,并只能作为Objective-C方法的返回类型。使用instancetype可让编译器准确推断返回的具体类型,把一些运行时的错误在编译时暴露出来
下面我们来看一个苹果官方给出的例子
@interface MyObject : NSObject + (instancetype)factoryMethodA; + (id)factoryMethodB; @end @implementation MyObject + (instancetype)factoryMethodA { return [[[self class] alloc] init]; } + (id)factoryMethodB { return [[[self class] alloc] init]; } @end void doSomething() { NSUInteger x, y; x = [[MyObject factoryMethodA] count]; // Return type of +factoryMethodA is taken to be "MyObject *" y = [[MyObject factoryMethodB] count]; // Return type of +factoryMethodB is "id" }
因为+ factoryMethodA的instancetype返回类型,该消息表达式的类型是为MyObject*。由于MyObject来没有一个计数方法,编译器给出了一个关于x行警告:
main.m: ’MyObject’ may not respond to ‘count’
2.未完待续 明天补上