oc swift 单例 调用_oc 调用 swift 单例 - CSDN
精华内容
参与话题
  • oc 调用 Swift 创建的单例Swift4)

    千次阅读 2018-10-17 17:00:45
    Swift创建了这样的一个单例 @objc open class Danli: NSObject { static let swiftSharedInstance = Danli() //在oc中这样写才能被调用 @objc open class func sharedInstance() -> Danli { ...

    Swift创建了这样的一个单例

    @objc
    open class Danli: NSObject
    {
    	static let swiftSharedInstance = Danli()
    	//在oc中这样写才能被调用
    	@objc open class func sharedInstance() -> Danli
        {
            return NFX.swiftSharedInstance
        }
    	
    	//下面的方法这样写
    	@objc open func start()
        {
    	    //TODO...
        }
    }
    

    可以看出来在前面除了加@objc,还要加open
    修饰符排行,越大越随心使用
    open> public > interal > fileprivate > private

    展开全文
  • 但是笔者今天突然发现之前写的一个oc时间管理类在swift中点语法不出来单例方法,一直显示has no member 'manager'。百思不得其解。后来终于发现了问题所在。 原因:Xcode 限制了 swiftOC 初始化相关方法的调用...

       转载请注明出处!!!

    在swift中调用方法都是直接点语法出来,不论是加方法(类方法)还是减方法(实例方法)直接点出来。但是笔者今天突然发现之前写的一个oc时间管理类在swift中点语法不出来单例方法,一直显示has no member 'manager'。百思不得其解。后来终于发现了问题所在。

    原因:
    Xcode 限制了 swift 对 OC 初始化相关方法的调用,+ (instancetype)manager;写法会被忽略。

    解决方案:
    使用 Xcode 认可的关键字 default singleton shared 为前缀声明方法名。

    + (instancetype)defaultManager;
    + (instancetype)singleton;
    + (instancetype)sharedManager;

    于是我就把原来的单例方法重新命名了,manager改为defaultManager。

    但是这也有个问题,就是找不到defaultManager这个方法,只能找到default方法。

    点进去发现default就是defaultManager。

    类.default()

     

    转载于:https://www.cnblogs.com/weicyNo-1/p/8144704.html

    展开全文
  • Swift实现OC中的单例模式

    千次阅读 2014-06-11 14:35:10
    一、MySingle类 import Foundation class MySingle{ //定义单例的属性 var name:String? var age:Int? var height:Double? //定义类方法 class func shareInstance()->MySingle{ struct qzSingle

    一、MySingle类

    import Foundation
    
    class MySingle{
        //定义单例的属性
        var name:String?
        var age:Int?
        var height:Double?
        //定义类方法
        class func shareInstance()->MySingle{
            struct qzSingle{
                static var predicate:dispatch_once_t = 0
                static var instance:MySingle? = nil
            }
            dispatch_once(&qzSingle.predicate,{
                    qzSingle.instance = MySingle()
                })
            return qzSingle.instance!
        }
    }
    


    二、AppDelegate中调用

    //单例的使用
            var single = MySingle.shareInstance()
            single.name = "秦志伟"
            single.age = 24
            single.height = 176.00
            
            println(single)
    

    运行结果:has 3 children
    展开全文
  • 什么是单例及如何在swift中使用单例

    千次阅读 2017-12-28 18:31:41
    关于单例OC没什么好说的 . 度娘搜了下swift单例,无外乎抄来抄去. 当然讲的讲的也挺好. 这里搜到一遍最新swift的资料 , 大家看一下 . 希望我有时间 翻一下. 单例是啥以及如何在swift中使

    原文地址: 点击打开链接

    最近抽风 粗略撸了几天的swift基础资料,  新项目就用swift写的.基本上是解决一个问题又碰到一个问题. 走到哪儿卡到哪儿
    关于单例OC没什么好说的 .  度娘搜了下swift的单例,无外乎抄来抄去.  当然讲的讲的也挺好.  这里搜到一遍最新swift的资料 ,  大家看一下 .  希望我有时间 翻一下.


    单例是啥以及如何在swift中使用单例

    软件开发中单例使用的非常广泛.尽管它很流行,一般还是反对使用它.  为啥呢? 在这个文章中,我将解释什么事单例以及如何使用

    文章支持到Swift4 , Xcode9

    什么是单例

    单例很好理解.单例模式就是保证类的实例对象只有一个. 很简单,对吧?

      单例要保证实例对象只有一个

    如果你用过苹果的框架,那你肯定有可能已经用到单例了.看看下面的栗子,是不是很熟悉

    // Shared URL Session
    let sharedURLSession = URLSession.shared
    
    // Default File Manager
    let defaultFileManager = FileManager.default
    
    // Standard User Defaults
    let standardUserDefaults = UserDefaults.standard
    
    // Default Payment Queue
    let defaultPaymentQueue = SKPaymentQueue.default()
    单例模式非常有用,你肯定有过多次想要确定某个类只实例化了一次,而且你用到的就是那个对象. 恰好这就是单例最基本且唯一的目标.


    Storekit framework 的默认支付队列就是一个很好的栗子. 应用程序永远都不应该创建 SKPaymentQueue 这个类的实例. 操作系统使用 StoreKit框架创建一个支付队列供你的APP使用.这个支付队列可以通过 SKPaymentQueue 这个类的 default() 方法获取到. 这真是单例模式的一个完美举例

    全局获取

    但是单例有一个副作用也是我们经常选择使用单例的原因: 全局获取  (全局获取 某一个对象)

    不过对单例而言 全局访问单例对象不过是单例模式的一点点副作用罢了.

    不幸的是,很多开发人员在工程里面很随意的通过单例获取对象,(不是说的我吧?哭).  默认的支付队列可以通过 default() 获取.这就意味着 你可以在项目的任何地方或者这个队列.确实很方便,不过是要付出代价的

    如果你想知道关于更过的单利模式的缺点,我建议你读一下这篇文章单利怎么坏了就 这篇文章有详细的说明 (没有翻译)


    swift中如何使用单例

    这里我将展示两个方法介绍如何在swift中使用单例.  第一个方法就不要用了,  我只是想用它说明一下swift语法的概念.

    全局变量

    最简单的创建单例的方法就是创建一个 全局变量

    let sharedNetworkManager = NetworkManager(baseURL: API.baseURL)
    
    class NetworkManager {
    
        // MARK: - Properties
    
        let baseURL: URL
    
        // Initialization
    
        init(baseURL: URL) {
            self.baseURL = baseURL
        }
    
    }
    通过在全局变量命名区创建一个变量, 整个项目的任何对象下 都可以获取这个单例对象了.举个例子 ,我们可以再AppDelegate中调用

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        print(sharedNetworkManager)
        return true
    }
    在swift中全局变量都是懒加载实现的,  也就是说 只有第一次调用时,才会被引用.
    swift 初始化有一个附加的好处就是自带dispath_once 的方法.这就保证了初始化方法只调用一次. 对你想要的单例模式而言这是很重要的

    使用全局命名空间也有很多缺点.最大的缺点就是命名空间 太凌乱了.另外一个缺点就是NetWorkManager的初始化方法不能够被私有化,这个这个类就有可能在很多地方被实例化.我介绍一个更好的,也是我更喜欢的在swift中使用的方法.

    Static Property and Private Initializer

    swift 2 有了静态成员和权限访问设置. 这就有了更多的创建单利的方法. 比使用全局变量更简洁 更优雅.  话不多说看栗子

    class NetworkManager {
    
        // MARK: - Properties
    
        static let shared = NetworkManager(baseURL: API.baseURL)
    
        // MARK: -
    
        let baseURL: URL
    
        // Initialization
    
        private init(baseURL: URL) {
            self.baseURL = baseURL
        }
    
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        print(NetworkManager.shared)
        return true
    }
    好几个实现的细节有所变化.首先init方法私有化,只有类自己内部才能创建自己的实例. 这是最明显的一个好处

    其次, 我们声明了 shared 这个静态常量.这个属性给其他类一个访问NetworkManager的通道.

    这就没有必要再给静态属性添加 lazy 关键字. 还记得前面说的 全局变量和静态成员默认都是懒加载的,这是另外一个好处

    接下来的这个例子就有一点复杂了.主要区别就是单例在闭包中初始化.这样允许初始化的时候配置更多的东西.

    class NetworkManager {
    
        // MARK: - Properties
    
        private static var sharedNetworkManager: NetworkManager = {
            let networkManager = NetworkManager(baseURL: API.baseURL)
    
            // Configuration
            // ...
    
            return networkManager
        }()
    
        // MARK: -
    
        let baseURL: URL
    
        // Initialization
    
        private init(baseURL: URL) {
            self.baseURL = baseURL
        }
    
        // MARK: - Accessors
    
        class func shared() -> NetworkManager {
            return sharedNetworkManager
        }
    
    }
    私有声明这个属性,单例通过shared方法访问.

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        print(NetworkManager.shared())
        return true
    }

    cocoa里面的单例

    通过上面的几个实现方法,我们已经模仿了cocoa 在swift3 中采用的好几个实现单例的方法.

    // Shared URL Session
    let sharedURLSession = URLSession.shared
    
    // Default File Manager
    let defaultFileManager = FileManager.default
    
    // Standard User Defaults
    let standardUserDefaults = UserDefaults.standard
    
    // Default Payment Queue
    let defaultPaymentQueue = SKPaymentQueue.default()

    单例有毛病吗

    在本篇的别处,我说了单例在项目中可能会有什么问题.我的建议就是能不用就不用.打算使用单例的时候,退一步看看有没有其他办法,是不是就必须要用单例?

    尽管单例没有直接的自身问题.大多数开发者还是因为错误的原因采用它.因为方便啊,单例在任何地方都可以访问.









    展开全文
  • swiftoc单例创建方式

    2015-10-23 09:39:35
    // GCD中的一次性代码 // 在写单例的时候,经常使用. ...//====================OC单例===================== /**  * 快速创建工具类  */ +(instancetype)share{  static id instance;    static di
  • Swift】3种单例模式实现详解

    千次阅读 2014-06-19 16:33:08
    本文来源于 https://github.com/hpique/SwiftSingleton 开源项目 个人li
  • 的交互也变得更方便了, 同时Swift编写的应用适配到iOS 7, 所以, 我们可以相信: 在未来使用swift的情况会逐渐增加了, 同时会涉及到OCSwift在项目中并存的情况, 这里我重新读了官方的'Using swift with Coco
  • 关于 Swift 单例的例子

    2019-07-06 00:22:28
    有的时候,我们需要一个类只要初始化一次就够了,比如音频播放器这种实例,因此需要我们使用单例,熟悉C++和OC都知道该怎么写 class CSingleton /* 懒汉式 */ { public: static CSingleton * GetInstance() ...
  • 一、 OC中创建单例   /**   应用场景:网络工具,音频工具(切换界面时,背景音乐继续放,不会重新播放,不会暂停)  */ @interface Singleton : NSObject //提供的静态实例的创建方法。(全局...
  • iOS单例的创建与销毁

    千次阅读 2017-08-24 18:42:27
    在iOS的日常开发经常要用到单例,单例一经创建就不会销毁,直到APP被杀掉的时候单例占用的空间才得以释放.现在比如我有一个自行车类,并且把它写成一个单例(共享自行车,呵呵),代码如下:#import "Bike.h"@implementation...
  • iOS 单例的销毁

    千次阅读 2018-05-17 12:06:11
    转载自: https://www.bbsmax.com/A/Vx5MoL99zN/今天做项目的时候,对于不同的用户,需要创建不同的数据库。...所以,需要销毁单例。销毁单例时,调用以下的代码:在创建单例的那个类中,调用如下的代码:...
  • Swift中我们可以通过如下方式,创建单例 public class MySingleton { public static let sharedInstance = MySingleton() public var title = "" // 用于测试单例 private init () {} // 必须用private修饰,在...
  • 在Swift开发中,我们对于跨类调用的变量常量,因为并没有OC中使用的全局头文件...为了解决这个问题,我考虑来写一个Swift单例来保存全局变量,并由OC的类来调取数据。  ps:差点忘记文章的初衷了。如果大家有好的用...
  • Swift 2.0 单例的用法

    2019-07-22 02:41:23
    单例我们项目中是很常用的,今天刚学了在swift中...我们先看看Swift单例的写法: import UIKit class Shareinstance: NSObject { var zhangxu:NSString = "" static let sharedSoundTools = Sharein...
  • 单例模式其实如果按照.net或者java体系来看就可以看作是全局静态变量;传值非常方便;delegate 回调模式也是可以传值的,不过delegate 不只是传值这么简单,它是回调函数,可以运行父窗口中得方法,或者delegate ...
  • 在Objective-C中经常会用到单例模式。最常见的就是: [UIApplication sharedApplication].delegate 这里的sharedApplication就是一个返回单例的方法。所谓的单例模式也就是在整个APP、或者软件中只有这个类的这么一...
  • #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN ... 单例方法 @return 返回单例对象 */ +(instancetype)sharedInstance; /** 销毁对象 */ +(void)attempDealloc; /** ...
  • Swift 7.OC单例

    2016-01-10 13:09:48
    ViewController.m #import "ViewController.h" ...//OCd调用 swift 需要导入桥接文件 命名空间-Swift.h 文件 @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
1 2 3 4 5 ... 20
收藏数 850
精华内容 340
关键字:

oc swift 单例 调用