首页 > 代码库 > iOS开发中单例对象的标准创建方法

iOS开发中单例对象的标准创建方法

//标准的单例写法

 

//以创建歌曲的管理者为例进行创建。
+(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.未完待续  明天补上