//标准的单例写法
//以创建歌曲的管理者为例进行创建。
+(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]; }
@endvoid 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.未完待续 明天补上
iOS开发中单例对象的标准创建方法,布布扣,bubuko.com