Tag: singleton

迅捷的Singleton模式

Singletons模式提供了对象的全局可访问共享实例。 在大多数情况下,您在iOS中不需要单例(这可能会被滥用以形成结构不良的代码),但是在某些情况下,仅拥有一个类的实例是有意义的。 。 苹果公司经常使用这种方法。 例如:UIApplication.sharedApplication(),NSUserDefaults.standardUserDefaults(),NSFileManager.defaultManager()均返回Singleton对象。 在Objective-C中 ,为确保仅创建一个单例对象的实例,将其初始化包装在调用dispatch_once函数中,该函数在应用程序的生命周期内一次执行一次块。 在Swift中 ,使用静态类型属性只是必要的,即使同时访问多个线程,该属性也只能被延迟初始化一次: 就是…单线单人! 用法是: Singleton.sharedInstance 由于所有对象都在Swift中带有默认的公共初始化程序,因此我们需要覆盖init并将其设为private 。 这样可以确保单例确实是唯一的,并防止外部对象创建自己的此类实例。 Singleton Shoudl也是最终版本,以防止将其子类化(如果Singleton需要其他功能,则应将其封装在扩展中)。 因此,我们需要添加另一行: 这是Singleton的最终正确实现。 感谢Michael Ormonde提出的“私有初始化”建议。 希望本文对您有所帮助。 谢谢阅读!

如何在Singleton方法中实现AVAudioPlayer?

这是我的代码: class SomeAudioManager: NSObject { class var sharedInstance: SomeAudioManager{ struct Static { static var onceToken: dispatch_once_t = 0 static var instance: SomeAudioManager? = nil } dispatch_once(&Static.onceToken) { Static.instance = SomeAudioManager() } return Static.instance! } func audioView(songname: NSString,format: NSString) { let audioPlayer:ava audioPlayer=try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(songname, ofType:format)!), fileTypeHint: AVFileTypeMPEGLayer3) audioPlayer!.delegate=self; self.audioPlayer!.play() } } 该AVAudioPlayer是在NSObject下,但我不能实现它。 当键入让audioPlayer:AVAudio – […]

带参数iOS的单例

我需要实现一个接受参数的单例类。 同一个对象将作为一个参数每一次传递,所以得到的单例对象将永远是相同的。 我正在做类似下面的代码。 这看起来好吗? 有没有更好的方法来实现我想达到的目标? – (id)sharedInstanceWithAccount:(UserAccount *)userAccount { if (!sharedInstance) { @synchronized(self) { sharedInstance = [[[self class] alloc] initWithAccount:userAccount]; } } return sharedInstance; } – (id)initWithAccount:(UserAccount *)userAccount { self = [super init]; if (self) { _userAccount = userAccount; } return self; } – (id)init { NSAssert(false, @"You cannot init this class directly. It needs […]

Swift中variables值变化时执行方法

当variables值改变时,我需要执行一个函数。 我有一个singleton类包含一个名为labelChange的共享variables。 这个variables的值来自另一个叫做Model类。 我有两个VC类,其中一个有一个button和一个标签,第二个只有一个button。 当按下第一个VC类中的button时,我正在用这个func更新标签: func updateLabel(){ self.label.text = SharingManager.sharedInstance.labelChange } 但是我想在labelChange的值改变时调用相同的方法。 所以在button点击我只会更新labelChange值,当这个事情发生时,我想用labelChange的新值更新标签。 另外在第二个VC中,我能够更新labelChange值,但是当这个值被改变时,我无法更新标签。 也许属性是解决scheme,但任何人都可以告诉我如何做到这一点。 第二次编辑: 单身职业: class SharingManager { func updateLabel() { println(labelChange) ViewController().label.text = SharingManager.sharedInstance.labelChange } var labelChange: String = Model().callElements() { willSet { updateLabel() } } static let sharedInstance = SharingManager() } 首先VC: class ViewController: UIViewController { @IBOutlet weak var label: UILabel! […]