首页
学习
活动
专区
工具
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

58930

你真的能写好一个么?

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

36910
  • 设计模式

    概念 一个只允许有一个实例,整个程序中需要多次使用,共享同一份资源的时候,就可以创建,一般封装成工具使用,苹果封装成单常用的有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,所以如果想只分配一次内存就要重写此方法

    15010

    你真的能写好一个么?

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

    92200

    浅析设计模式

    开发中经常会用到设计模式,目的就是为了程序的整个生命周期内,只会创建一个的实例对象,而且只要程序不被杀死,该实例对象就不会被释放。保证一个仅有一个实例,并提供一个访问它的全局访问点。...创建的几种方式 方式一 传统且正规的方法是把一次性代码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

    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,在其他引用全局变量,其他就可以修改全局变量的值,导致对象存在被修改的风险。

    89330

    对象

    开发中经常需要使用对象。...今天主要说的是宏 首先先简单介绍一下 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);  这样就能报保证多个都是

    59980

    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

    72220

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

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

    43730

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

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

    70830

    iOS 设计模式解读 原

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

    31920

    的必要认识(深刻理解)

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

    392100

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

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

    1.2K10

    iOS开发中的模式

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

    80620

    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

    39810
    领券