美文网首页
[iOS][OC] 提供函数接口获取单例对象

[iOS][OC] 提供函数接口获取单例对象

作者: BudSwift | 来源:发表于2018-11-07 13:41 被阅读2次

背景

单例模式在 iOS 开发中的运用十分常见,比如系统的 API 中就有 UIApplicationNSNotificationCenter等,一般提供单例的 API 是 OC 的类方法(class method)调用方式,典型的范式如下:


[UIApplication sharedApplication]
[NSNotificationCenter defaultCenter]
[UNUserNotificationCenter currentNotificationCenter]

在实际的调用中,是这样的

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onRefreshBiddingList:)
                                         name:kGSRefreshBiddingGoods
                                        object:nil];

因为 OC 的命名习惯,这样的调用显得冗长而无美感,对于有强迫症的同学来说有些不能接受。
当然,可以尝试变换一下:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
            selector:@selector(onRefreshBiddingList:)
             name:kGSRefreshBiddingGoods
                     object:nil];

或者干脆定义一个宏,不过宏定义在接口头文件一般不容易被发现。

#define NSNotifcaitionCenterInstance [NSNotificationCenter defaultCenter]

用函数提供接口获取单例

使用静态函数提供接口是更简洁的方法,举例如下:

// 声明
FOUNDATION_EXTERN GSPushManager *GSPushManagerInstance();
/// 实现
GSPushManager *GSPushManagerInstance() {
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[GSPushManager alloc] init];
    });
    
    return instance;
}

调用接口时,使用函数接口如下:

[GSPushManagerInstance() doSomething];

也可以考虑兼容,提供一个类方法 API 供调用,实现如下:

// 声明
+ (instancetype)sharedInstance;
// 实现
+ (instancetype)sharedInstance {
    return GSPushManagerInstance();
}

延伸

Swift 的单例用法,是将单例设置为类的一个属性

public class Singleton {
    //通过关键字static来保存实例引用
    private static let instance = Singleton()
    
    //私有化构造方法
    private init() { }
    
    //提供静态访问方法
    public static var shared: Singleton {
        return self.instance
    }
}

实际上, OC 为了兼容 Swift,为此定义了类属性的概念,即在属性声明中加入 class关键字,比如 UIApplication

/// 声明
@property(class, nonatomic, readonly) UIApplication *sharedApplication
//调用
[UIApplication.sharedApplication openURL:....];

加我微信沟通。


相关文章

  • [iOS][OC] 提供函数接口获取单例对象

    背景 单例模式在 iOS 开发中的运用十分常见,比如系统的 API 中就有 UIApplication、NSNot...

  • 设计模式 - 单例模式

    饿汉式单例 饿汉式单例,故名思意就是在类一加载时就进行创建,构造器私有并提供对外获取对象的接口。 缺点:浪费空间,...

  • python 装饰器常见用法

    跟踪调用 用例: 计时调用 用例: 单例 用例: 跟踪对象接口 用例: 管理函数和类 用例: 验证函数参数 用例:...

  • 单例

    内存中只有一个对象实例 提供一个全局访问点 OC中的单例 swift中的单例 swift改进过的单例

  • 再说单例

    单例模式 保证客户端运行期间只含有一个对象,其他类不能够创建对象,对象由本类创建,提供一个获取该对象的接口。这个对...

  • Swift中的单例

    项目开发中往往经常使用单例模式,单例的目的: 内存中只有一个对象实例 提供一个全局访问点 OC 中的单例写法 Sw...

  • kotlin-5、类与对象

    创建空类 构造函数 调用构造函数 继承 接口 实现接口 data类 最简单的单例 自己实现单例

  • UIApplication

    UIApplication单例对象能够执行的方法 iOS程序的启动过程: UIApplicationMain函数中...

  • AVAudioSession

    AVAudioSession AVAudioSession 是一个单例对象,提供了应用程序的音频会话交互的接口。 ...

  • ios~单例模式:

    在iOS OC中,一般我们都是用官方推荐的写法来写单例:GCD方式单例 分析单例 static SharedPer...

网友评论

      本文标题:[iOS][OC] 提供函数接口获取单例对象

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