iOS 单例模式实现的两种方式

简述
面向对象应用程序中的单例类(singleton class)总是返回自己的同一个实例。它提供了对象所提供的资源的全局访问点。与这类设计相关的设计模式称为单例模式。

用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。

这个方法应该是静态方法,因为让类的实例去生成另一个唯一实例毫无意义。

2.2 何时使用单例模式
(1)类只能有一个实例,并且必须从一个为人熟知的访问点对其进行访问,比如工厂方法;

(2)这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

2.3 单例的原则
(1)发起调用的对象(calling object)不能以其他分配方式实例化单例对象。否则,就有可能创建单例类的多个实例。

(2)对单例对象实例化的限制应用与引用计数内存模型共存。

2.4 Cocoa Touch中常见的单例模式
UIApplication,UIAccelerometer和NSFileManager类。//SharedSingleton.h 文件#import <Foundation/Foundation.h>


@interface SharedSingleton : NSObject{
    NSString *name;
}
@property(nonatomic,retain)NSString *name;

+(id)sharedSingleton;

@end

//SharedSingleton.m文件
#import "SharedSingleton.h"//创建静态变量,初始化为nil
static SharedSingleton *s = nil;
@implementation SharedSingleton

@synthesize name = _name;

+(SharedSingleton *)sharedSingleton{
    //第一种方式.
//    if (s == nil) {
//        s = [[SharedSingleton alloc]init];
//    }
//    return s;
    //gcd方式
    static dispatch_once_t once;
    dispatch_once(&once,^{
        s = [[SharedSingleton alloc]init];
    });

    return s;
}
@end
时间: 2024-08-08 14:41:22

iOS 单例模式实现的两种方式的相关文章

iOS 自定义layer的两种方式

在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个图层 @property(nonatomic,readonly,retain) CALayer *layer; 每一个UIView内部都默认关联一个CALayer,我们可称这个Laye

关于设置iOS横竖屏的两种方式(转载)

iPhone的横屏竖屏针对iOS系统版本分为两种开发方式: 一种是iOS 6之前的使用模式 一种是iOS6的新模式. 两者的区别还是蛮大的. 1:iOS6之前通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewController支持旋转,只需要重写shouldAutorotateToInterfaceOrientation方法.如下示例,设置以后,屏幕被旋转时只支持横屏转换: - (BOO

iOS 拨打电话的两种方式

第一种方式 NSString *phone = @"88888888" if (phone != nil) { NSString *telUrl = [NSString stringWithFormat:@"telprompt:%@",phone]; NSURL *url = [[NSURL alloc] initWithString:telUrl]; [[UIApplication sharedApplication] openURL:url]; } 第二种方式

IOS文件操作的两种方式:NSFileManager操作和流操作

1.文件的创建 -(IBAction) CreateFile { //对于错误信息 NSError *error; // 创建文件管理器 NSFileManager *fileMgr = [NSFileManager defaultManager]; //指向文件目录 NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; //创建一个目录 [[NSFi

iOS-动画的两种方式

第一种   头尾式动画 [UIView beginAnimations:nil context:(nil)]; [UIView setAnimationDuration:2]; self.btnIcon.center = centerPoint; [UIView commitAnimations]; [UIView beginAnimations:nil context:(nil)]; [UIView setAnimationDuration:2]; self.btnIcon.bounds =

iOS退出键盘的两种方式

1,可以让叫出键盘的那个控件,退出第一响应者; 例如:textField叫出的键盘,那么就可以调用textField.resignFirstResponder,达到谁叫出的键盘谁退回去 2,可以让叫出键盘的那个控件的父类控件退出键盘: 例如,textField叫出的键盘,它的父类控件是View,那么就调用:[View endEditing:YES]

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

iOS中创建单例的两种方式

刚刚开始做iOS开发的时候,不知道怎么创建单例,在网上搜的也大多数都不太全,所以总结了一下创建单例的两种方式 首先在.h文件中声明类方法 1 +(instancetype)sharedUtils; 然后在.m文件中实现它,实现的方法有两种 第一种,在创建一个对象时先判断在程序中有没有创建过这个对象 1 static PublicUtils *DefaultManager = nil; 2 3 +(instancetype)sharedUtils 4 { 5 if (!DefaultManager

ios给NSMutableDictionary循环赋值的两种方式,在循环内初始化NSMutableDictionary和在循环外初始化NSMutableDictionary有何区别?(已解决)

NSMutableArray * arrayName = [NSMutableArray array]; NSMutableArray * array = [NSMutableArray array]; [array removeAllObjects]; for (int i = 0; i< 10; i++) { NSString * str = [NSString stringWithFormat:@"name%i",i]; [arrayName addObject:str];