一个工具类的单例模式

最近写了个工具类,用来集成短信、邮件、电话、打开Safari/AppStore、打开相机或相册,但是写 delegate 的时候,发现有警告:

Incompatible pointer types assigning to 'id<MFMessageComposeViewControllerDelegate>' from 'Class'

最后,发现,用单例模式才可以。原因:类方法的self不能充当delegate

下面是stackoverflow里解决方法,构造单例模式:

Utility.h
@interface Utility : NSObject <AVAudioPlayerDelegate>
+ (Utility *)sharedUtility;
@end
Utility.m

@implementation Utility
+ (Utility *)sharedUtility
{
    static Utility *theUtility;
    @synchronized(self) {
        if (!theUtility)
            theUtility = [[self alloc] init];
    }
    return theUtility;
}

- (void)playAudioFromFileName:(NSString *)name ofType:(NSString *)type withPlayerFinishCallback:(SEL)callback onObject:(id)callbackObject
{
    ... 
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [self getResourceURLForName:name ofType:type] error: nil];
    audioPlayer.delegate = self;
    ...
}

@end
Usage

[[Utility sharedUtility] playAudioFromFileName:@"quack" ofType:"mp3" withPlayerFinishCallback:@selector(doneQuacking:) onObject:duck];

最后发现,生成单例的方法各不相同,下面是另外一种,至于用那一种更好,或者都一样?简主暂时也不知道。。

##static id _sharedInstance = nil;
+(instancetype)sharedInstance
{
    static dispatch_once_t p;
    dispatch_once(&p, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

最后

  • 如果有什么疑问,可以在评论区一起讨论;
  • 如果有什么不正确的地方,欢迎指导!


注:本文首发于 iHTCboy's blog,如若转载,请注明来源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 写一个判断rootviewcontroller的工具类CheckRootVC_Obj,想使用类方法,又在此类方法里...
    goyohol阅读 10,441评论 0 3
  • 在iOS开发过程中, 我们可能会碰到一些系统方法弃用, weak、循环引用、不能执行之类的警告。 有代码洁癖的孩子...
    磁针石阅读 13,939评论 0 16
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 9,896评论 4 34
  • 15年前,我也曾带着无限的憧憬,带上我的全部技能身披战袍,赴一场自以为终结苦海开始辉煌人生时刻的战场,谁曾想战争很...
    令宜阅读 3,034评论 1 2
  • 思量中耽搁了许久,才在这个安静的时刻落笔。 窗外,稀疏的雪花散漫着飘落,显得那般沉稳,如天空之城中优雅的天使,轻轻...
    东山谢安阅读 4,705评论 0 10

友情链接更多精彩内容