首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

super allocWithZone在单例类概念中有一些疑问

在单例类概念中,super allocWithZone 是一个方法,用于在 Objective-C 中创建单例对象。单例类是一个特殊的类,它只能创建一个实例,通常用于全局访问和共享资源。

在 Objective-C 中,创建单例对象的步骤如下:

  1. 重写 allocWithZone 方法,该方法返回一个新的实例。
  2. allocWithZone 方法中,调用 super allocWithZone 方法来创建一个新的实例。
  3. 检查是否已经存在一个实例,如果不存在,则创建一个新的实例。
  4. 如果已经存在一个实例,则返回该实例。

以下是一个简单的单例类的示例:

代码语言:objective-c
复制
@interface MySingleton : NSObject

+ (MySingleton *)sharedInstance;

@end

@implementation MySingleton

+ (MySingleton *)sharedInstance {
    static MySingleton *_sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    return self;
}

@end

在这个示例中,sharedInstance 方法返回一个单例对象,allocWithZone 方法被重写,以便在调用 super allocWithZone 方法时创建一个新的实例。copyWithZonemutableCopyWithZone 方法也被重写,以确保单例对象不会被复制或修改。

总之,super allocWithZone 是一个在 Objective-C 中创建单例对象的方法,它在单例类概念中起着重要的作用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS - ARC与MRC的单例设计模式

单例设计模式(Singleton) �定义 就是保证某个类创建出来的对象从始到终只有一个的一种方案 作用 节省内存开销 保证整个程序中使用同一份资源 实现 首先将我们的环境设置为非ARC环境,即MRC,...MRC环境 在MRC模式下,我们得自己手动释放资源,所以得重写一些与资源创建与释放相关的方法,以保证单例对象的唯一。...可以的,利用宏 首先先说下一些关于宏的知识吧 使用 #define 关键字来定义宏 宏定义只能是单行的,不能换行 那现在来讨论下一些疑惑吧,你说宏只能单行,可是创建单例的代码可是有很多行呀!...LXFFileTool SingletonM(FileTool) @end 好,现在还有一个问题,就是如果我的项目中有个别文件是需要MRC环境的,那我该怎么办才能让创建单例也是如此简单呢?...我们只要创建一个类,然后在.h文件中写SingletonH(XXX),再在.m文件中写SingletonM(XXX)就可以实现单例了~ 指定环境 顺便提下如何在MRC下指定某个类文件使用的环境为ARC

59430

你真的能写好一个单例么?

原来项目中有单例继承的情况?(关于单例是否可以继承, 以及什么场景下用单例继承, 这是另外一个争论话题~)。...弊端:无法实现单例继承 3 仔细观察上个版本的崩溃堆栈, 发现问题所在就是 allocWithZone:的实现!...大功告成~~~ 放到项目中跑起来, 貌似隐约感觉不对~~~ 有些单例中的状态怎么被reset 了? 添加一些生命周期方法, 加上日志测试。。。 原来问题在-init上!...4 我们在项目中, 为了减少重复代码, 把单例的实现写成一个模板, 只需要把这个宏添加到类实现中, 就能把这个类变成单例。详情可以参考我很久很久以前的文章。 如何保证初始化方法不可重入呢?...我们可以给每个单例增加一个 category, 然后在 category 中实现+load方法(不用担心会覆盖主类中的+load, 每个 category 都可以添加自己的+load方法, 而且这些+load

37410
  • 单例设计模式

    概念 一个类只允许有一个实例,在整个程序中需要多次使用,共享同一份资源的时候,就可以创建单例,一般封装成工具类使用,苹果封装成单例常用的有UIApplication,NSUserDefaults,NSNotificationCenter...,NSFileManager等等 优缺点 优点:因为单例模式会使类只有一个实例所以方便使用,并且节省内存资源的分配.因为使用GCD的方式是线程安全的,所以会避免资源的多重使用 缺点: 单例创建的内存只有在程序结束时才会被释放...由于单例不能被继承(因为返回的是同一个实例),所以扩展性很不好 实现 一般情况下创建一个单例对象都有一个与之对应的类方法 一般情况下用于创建单例对象的方法名都以share或default开头加上当前类名...sharePerson]; NSLog(@"p:%p",p); Person *p1 = [[Person alloc]init]; NSLog(@"p1:%p",p1); 这种不能算是真正意义上的单例...,因为类方法和alloc init创建的单例分配的内存可能不一样 p :0x600000c1da40 p1:0x600000c76c60 因为alloc会执行allocWithZone,所以如果想只分配一次内存就要重写此方法

    15310

    你真的能写好一个单例么?

    单例可能是 iOS 开发者最熟悉设计模式之一了。 我们的项目里头也使用了很多单例。 最近为了解决项目中单例的 bug 而花费了两天多的时间,发现用 ObjC 写好一个单例真的不容易!...在苹果网站上, 曾经有一份OC实现单例的 sample code(现在没有了,链接失效了, 现在只有 swift 的, 毕竟现在的小甜甜是 swift)。...原来项目中有单例继承的情况(关于单例是否可以继承, 以及什么场景下用单例继承, 这是另外一个争论话题~)。...V4.0 我们在项目中, 为了减少重复代码, 把单例的实现写成一个模板, 只需要把这个宏添加到类实现中, 就能把这个类变成单例。详情可以参考我很久很久以前的文章。 如何保证初始化方法不可重入呢?...我们可以给每个单例增加一个 category, 然后在 category 中实现+load方法(不用担心会覆盖主类中的+load, 每个 category 都可以添加自己的+load方法, 而且这些+load

    93300

    浅析单例设计模式

    在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放。保证一个类仅有一个实例,并提供一个访问它的全局访问点。...创建单例的几种方式 方式一 传统且正规的方法是把一次性代码dispatch_once写到allocWithZone:方法中去,目的是保证allocWithZone:方法只被调用一次,这样一来,凡是通过[...协议 return _instance; } 方式二 更加简单的方式是把一次性代码dispatch_once写到获取单例对象的类方法中去。...方式四 当然还可以在单例的全局访问点(类方法)中使用同步锁,其结果和方式二是一样的:外部都不能直接通过调用[[class alloc] init]方法来获取单例,代码如下: + (instancetype...在单例类(拿Person类为例)中导入这个头文件。

    7.1K20

    iOS-单例模式写一次就够了

    如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 单例模式因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。...缺点: 单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放。 单例类无法继承,因此很难进行类的扩展。...注意:我们在使用单例类之前,一定要考虑好单例类是否适合和类以后的扩展性,避免盲目滥用单例 二....单例在ARC中的实现 ARC中单例实现步骤 1 在类的内部提供一个static修饰的全局变量 2 提供一个类方法,方便外界访问 3 重写+allocWithZone方法,保证永远都只为单例对象分配一次内存空间...单例在MRC中的实现 MRC单例实现步骤 1 在类的内部提供一个static修饰的全局变量 2 提供一个类方法,方便外界访问 3 重写+allocWithZone方法,保证永远都只为单例对象分配一次内存空间

    1.5K50

    单例对象

    在开发中经常需要使用单例对象。...今天主要说的是单例宏 首先先简单介绍一下 1.单例设计模式(Singleton) 1> 什么: 它可以保证某个类创建出来的对象永远只有1个 2> 作用(为什么要用) * 节省内存开销 * 如果有一些数据..., 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的) * 一般来说, 工具类设计为单例模式比较合适 3> 怎么实现 * MRC(非ARC) * ARC 代码采用的是mrc...的环境 单独创建一个.h文件 例如SingleTon.h 1 //帮助实现单例设计模式 2 /* 3 alloc方法内部会调用allocWithZone 4 */ 5 6 #define...soundTool *s2 = [soundTool sharedsound]; NSLog(@"%p %p ",d1,d2); NSLog(@"%p %p ",s1,s2);  这样就能报保证多个类都是单例的

    60180

    iOS小技能: static、extern 存储类的应用(创建共享实例、申明公共方法、全局字符串常量)

    引言 在 C 语言中,程序内变量或函数的作用域和寿命是由其存储类确定的,比如static、extern。...一个类只有一个对象 /** 单例模式:一个类只有一个对象 */ @implementation KNMusicTool extern id _musicTool;//全局变量 /** alloc...allocWithZone:zone]; } } return _musicTool; } /** 方便访问单例对象*/ + (instancetype)sharedMusicTool...问题1:extern 对全局变量的引用 会在全程序中查找 _musicTool,在其他类引用全局变量,其他类就可以修改全局变量的值,导致单例对象存在被修改的风险。...extern id _musicTool; //引用全局变量,会在全程序中查找 _musicTool,在其他类引用全局变量,其他类就可以修改全局变量的值,导致单例对象存在被修改的风险。

    90930

    iOS多线程 - GCD

    二、任务和队列 GCD 中有 2 个核心概念 任务:执行什么操作 队列:用来存放任务 GCD 的使用就 2 个步骤 定制任务 确定想做的事情 *将任务添加到队列中 GCD 会自动将队列中的任务取出...三、执行任务 GCD 中有 2 个用来执行任务的常用函数 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block)...}); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ //等前面的异步操作都执行完毕后,回到主线程... }); 十、单例模式...单例模式的作用 1.可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问 2.从而方便地控制了实例个数,并节约系统资源 *单例模式的使用场合 在整个应用程序中,共享一份资源(这份资源只需要创建初始化...dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); } +(instancetype

    72420

    iOS设计模式系列:单例设计模式

    单例设计模式从字面意思上来说,就是一个类在系统运行时,只创建一个实例。可以用于需要被多次调用的或者多次使用的资源中。比如我们常见的网络请求类、工具类等等。...二、单例的要点 该类有且只有一个实例 该类必须能自行创建这个实例 该类必须能够向整个系统提供这个实例 三、单例的优缺点 优点: 提供了唯一实例的受访对象 因为在系统中只存在一个实例,在频繁访问和调用时,...四、单例类的实现 为单例对象创建一个静态实例,可以写成全局的,也可以在类方法中实现,并置为nil。 用GCD多线程的方式来实现单例,用dispatch_once_t来保证线程的安全性和单一性。...方法,所以只能通过其父类分配内存,即[super allocWithZone] * */ + (instancetype)allocWithZone:(struct _NSZone *)zone {...allocWithZone:zone]; }); return _singleton; } /** * 单例对象对外的唯一接口,用到dispatch_once在初始化时执行一次任务

    44830

    iOS中的单例你用对了么?Objective-C中的单例Swift中的单例

    单例模式怎么定义的,可能在不同的语言,不同的书中不完全一样,但是概况开来都应该是:一个类有且仅有一个实例,并且自行实例化向整个系统提供。...因此,首先你可能需要确定你是真的需要一个单例类,还是说仅仅是需要一个方便调用的实例化方法。...如果你是真的需要一个单例类,那么你就应该确保这个单例类,有且仅有一个实例(不管怎么操作都只能获取到这个实例)。...最近看到一些github上的单例使用,别人的用法,有一些思考,然后写demo测试了下,就这个简单的单例也有一些坑呢,希望能给他人一些提醒。...() } } 当然,由于Swift的特性,在Swift中创建单例的方式也不止一种,需要注意的是要确保该类有且仅有一个实例就OK了。

    71530

    iOS 单例设计模式解读 原

    iOS 中单例设计模式的解读与用法 一、单例的作用       顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次。...它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过单例来实现传值。UIApplication、NSUserDefaults等都是IOS中的系统单例。...self alloc] init];            });       return ManagerInstance;   } 三、代码的优化         通过上面的方法,我们已经可以使用类方法来得到这个单例...,但很多时候,项目的工程量很大,还有可能会很多开发者同时参与一个项目的开发,为了安全与管理代码的方便,也为了给不是这个单例的创作者但会用到这个单例的开发人员一些提示,我们通常会重写一些方法: 首先我们自己实现一个...alloc方法: +(instancetype)myAlloc{     return [super allocWithZone:nil]; } 将我们的单例实现方法略作修改: +(ZYHPayManager

    32020

    单例的必要认识(深刻理解)

    单例类也可以防止他人复制(copy),保留(retain)或释放(release)实例。如果您发现需要,您可以创建自己的单例。...*testSingleton = nil; 这样,在获取实例的方法中,只有在静态实例为nil的时候,产生一个你的类的实例,这个实例通常被称为共享的实例; 2、重写allocWithZone方法,用于确定...所以我们在allocWithZone方法中直接返回共享的类实例; 3、写+(instancetype)shareSingleton的函数体 创建方法 一、传统方法 +(instancetype)shareSingleton...普通类跟单例的区别 普通类允许调用者根据需要创建尽可能多的类的实例,而对于单例类,每个进程只能有一个类的实例,保证了单例数据的唯一性,安全性 调用下面方法: -(void)testSigleton {...,全局唯一 扩展二:(宏定义单例) 作用:有时在项目中需要创建好多个单例,把单例的代码定义为宏,则可以省去重复代码,节省时间。

    394100

    面向对象设计的设计模式(四):单例模式

    成员与类图 成员 单例模式只有一个成员,就是单例类。因为只有一个成员,所以该设计模式的类图比较简单: 模式类图 ?...单例模式类图 一般来说单例类会给外部提供一个获取单例对象的方法,内部会用静态对象的方式保存这个对象。 代码示例 场景概述 在这里我们创建一个简单的打印日至或上报日至的日至管理单例。...因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。 因为该类在系统内存中只存在一个对象,所以可以节约系统资源。 缺点 由于单例模式中没有抽象层,因此单例类很难进行扩展。...那么如果这个单例持有一些数据的话,在回收后重新实例化时就不复存在了。...iOS SDK 和 JDK 中的应用 在Objective-C语言中使用单例模式的类有NSUserDefaults(key-value持久化)和UIApplication类(代表应用程序,可以处理一些点击事件等

    1.3K10

    iOS开发中的单例模式

    简介 开发者应该经常看到单例模式这个设计模式,那什么是单例模式呢?...那么对于这种要求保证只有一个对象实例的设计模式,就称为单例模式,简明易懂是吧。 iOS开发中的实现 介绍完了单例模式是什么,现在看看怎么实现。...各个语言都有自己的单例模式,其实对于单例模式的实现,最根本的一点就在于保证全局只有一个对象实例。也就是说每次要使用的时候,如果还没创建过实例,那就创建,如果已经创建过了,那就直接获取之前创建过的。...在 alloc 时,Objective-C 会调用 allocWithZone ,通过覆写它来返回单例。复制对象的时候也是通过覆写调用的 copyWithZone 方法来达到返回唯一单例的目的。...结 用上面的方法,就可以创建单例了。具体的用法,纯粹看各自的发挥,可以将一些常用的操作提取出来放在头文件中供调用,这样其实就能方便的获取和操作单例的内容了。

    81920

    Objective-C中的单例模式

    不过在23种设计模式里面单例模式还是算比较好理解的, 那么在OC中又是怎么来表示单例模式的呢?下面会结合着代码,理解一下OC中得单例模式。     ​    ​...首先得了解什么是单例模式,用大白话说,单例模式就是在程序中这个类只对应着一个实例,这就是单例模式,单例模式一般用全局静态对象来实现。...下面我们会建立一个生成单例的类SingletonClass,在实现文件中定义各种方法来实现我们的单例模式。     ​    ​...*)zone {     if (single == nil) {         single = [[super allocWithZone:zone] init];     }     return... single; }     ​    ​4.为了防止用户把单例进行深浅拷贝,我们需要重写copyWithZone方法和mutableCopyWithZone方法,在重写方法之前我们的单例类必须遵循协议

    1.9K70

    Objective-C 观察者模式--简单介绍和使用

    期刊要能记录有哪些订阅用户 订阅服务中心负责管理, 当有某一期刊更新时, 通知该期刊的订阅用户或者发送新期刊给订阅用户 下面我们依照这个思路构造工程 这里把订阅服务中心看做一个对象, 并把它设计成一个单例...subscriptionMessage:(id)message subscriptionNumber:(NSString *)subscriptionNumber; 7 8 @end 下面构造订阅服务中心对象-用单例模式...SubscriptionCustomerProtocol.h" 3 4 @interface SubscriptionServiceCenter : NSObject 5 6 /** 7 初始化单例方法...zone 地址空间 17 @return 返回单例对象 18 */ 19 + (id)allocWithZone:(struct _NSZone *)zone; 20 21 /** 22 copy...viewDidLoad]; 15 16 //创建一个订阅服务中心单例 17 SubscriptionServiceCenter *center = [SubscriptionServiceCenter

    40410
    领券