美文网首页
单例(singleton)

单例(singleton)

作者: 143db5b5572a | 来源:发表于2016-07-03 00:04 被阅读0次

//

//  SoundTools.m

//  02-单例(ARC)

//

//  Created by apple on 14-8-24.

//  Copyright (c) 2014年apple. All rights reserved.

//

#import"SoundTools.h"

/**

单例小结:

1.创建一个静态的实例对象,在静态区保存唯一的副本

2.创建一个sharedXXX类方法,方便全局统一条用

3.重写allocWithZone方法

如果是面试,写上面三步就够了

4. copyWithZone方法

*/

@implementationSoundTools

staticSoundTools*_instance;

/**是为当前对象分配内存空间,所有方法都会最终调用的方法*/

/**

无论如何实例化,在内存中都最多保留一个副本,对象应该保存在静态区

静态区中的对象,是在整个程序结束后,才会被销毁。

*/

+ (id)allocWithZone:(struct_NSZone*)zone

{

//    return nil;

//懒加载,不能保证多线程并发的实例化是唯一的

//加互斥锁,性能非常糟糕。苹果强烈不建议程序员使用!

//    @synchronized(self) {

//        if (_instance == nil) {

//            _instance = [super allocWithZone:zone];

//        }

//    }

// dispatch_once能够确保块代码中的操作只被执行一次

staticdispatch_once_tonceToken;

dispatch_once(&onceToken, ^{

// block中的代码只能被执行一次

_instance= [superallocWithZone:zone];

});

return_instance;

}

+ (instancetype)sharedSoundTools

{

//无论调用多少次类方法,对象只会被初始化一次

staticdispatch_once_tonceToken;

dispatch_once(&onceToken, ^{

_instance= [[selfalloc]init];

});

return_instance;

}

- (id)copyWithZone:(NSZone*)zone

{

return_instance;

}

#pragma mark - MRC相关方法

//判断是否支持MRC

#if !__has_feature(objc_arc)

- (onewayvoid)release {}

- (id)retain {return_instance; }

- (id)autorelease {return_instance; }

- (NSUInteger)retainCount {returnUINT_MAX; }

#endif

- (id)init

{

self= [superinit];

if(self) {

staticdispatch_once_tonceToken;

dispatch_once(&onceToken, ^{

//对象属性的初始化

self.num=100;

NSLog(@"初始化了- %d",self.num);

});

}

returnself;

}

- (void)playSoundWithName:(NSString*)name

{

NSLog(@"播放声音%@", name);

}

@end

相关文章

网友评论

      本文标题:单例(singleton)

      本文链接:https://www.haomeiwen.com/subject/oynqjttx.html