Apple官方建议
static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager { @synchronized(self) { if (sharedGizmoManager == nil) { [[self alloc] init]; // assignment not done here } } return sharedGizmoManager; } + (id)allocWithZone:(NSZone *)zone { @synchronized(self) { if (sharedGizmoManager == nil) { sharedGizmoManager = [super allocWithZone:zone]; return sharedGizmoManager; // assignment and return on first allocation } } return nil; //on subsequent allocation attempts return nil } - (id)copyWithZone:(NSZone *)zone { return self; } - (id)retain { return self; } - (unsigned)retainCount { return UINT_MAX; //denotes an object that cannot be released } - (void)release { //do nothing } - (id)autorelease { return self; }按照我在java开发中的经验,我一般会将其中的如下写法
static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager { @synchronized(self) { if (sharedGizmoManager == nil) { [[self alloc] init]; // assignment not done here } } return sharedGizmoManager; } + (id)allocWithZone:(NSZone *)zone { @synchronized(self) { if (sharedGizmoManager == nil) { sharedGizmoManager = [super allocWithZone:zone]; return sharedGizmoManager; // assignment and return on first allocation } } return nil; //on subsequent allocation attempts return nil }
改成
static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager { @synchronized(self) { if (sharedGizmoManager == nil) { sharedGizmoManager = [[self alloc] init]; // assignment not done here } } return sharedGizmoManager; }
不懂这里还要弄个(id)allocWithZone:(NSZone *)zone起啥子用?
一探究竟:
调用
控制台输出结果
至此终于真相大白了。。原来[[self alloc] init]; 调用时,会默认调用+ (id)allocWithZone:(NSZone *)zone方法的。。sharedGizmoManager 最终是在allocWithZone:(NSZone *)zone方法中完成了初始化操作。。
sharedGizmoManager = [super allocWithZone:zone];
阿堂再进一步查cocoa文档,原来allocWithZone:(NSZone *)zone是在给对象sharedGizmoManager 分配内存空间了。其中zone 可以想象成一个内存池,alloc,allocWithZone或是dealloc这些操作,都是在这个内存池中操作的。cocoa总是会配置一个默认的NSZone,任何默认的内存操作都是在这个“zone”上操作的。默认的NSZone的缺陷在于,它是全局范围的,时间一长,必然会导致内存的碎片化,如果你需要大量的alloc一些object,那么性能就会受到一些影响。所有cocoa提供方法,你可以自己生成一个NSZone(实际上就是我上面的demo那样,重写allocWithZone方法就行了),并将alloc, copy全部限制在这个”zone“之内。
相关推荐
类方法常用于初始化、单例模式等场景。 ### 6. 内存管理(ARC) Objective-C的自动引用计数(Automatic Reference Counting, ARC)负责对象的内存管理。当对象的引用计数为0时,系统会自动释放该对象,避免内存...
- **单例模式**:在创建单例对象时,应确保线程安全。 - **导入**:在导入系统框架时,应使用尖括号`<...>`,而在导入自定义文件时应使用双引号`"..."`。 ### 总结 这些规范的遵循不仅能够保证代码的一致性,也...
这在C中通常称为“设计模式”,如工厂模式、单例模式等。 6. 动态内存分配:在C中,面向对象编程通常需要动态内存分配来创建对象实例。通过`malloc`和`free`函数来分配和释放内存,但需要注意内存泄漏和悬挂指针的...
Objective-C,简称ObjC,是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,具有Smalltalk风格的消息传递机制。Objective-C主要用于iOS和macOS应用开发,是Apple平台的标准开发语言。本资料“Object-C/...
- **Singleton**:单例模式,确保一个类只有一个实例。 - **Delegate**:代理模式,用于对象间的通信。 ### 9. Xcode工具 - **Xcode IDE**:Apple官方的开发工具,集成了代码编辑、调试、构建等功能。 - **...
例如,可以定义一个静态全局变量来保存单例对象的引用,从而实现单例模式。 #### 隐藏与封装 - **概念**:封装是一种设计原则,目的是隐藏对象的内部状态,并通过公开的接口来提供对这些状态的操作。这是面向对象...
1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。在iOS中,单例常用于管理网络请求(如NSURLSessionConfiguration)、用户首选项(NSUserDefaults)或全局状态(如App Delegate)。 2. *...
例如,工厂模式用于创建对象,单例模式确保一个类只有一个实例,观察者模式用于实现对象间的发布-订阅通信。 6. UML(统一建模语言):UML是面向对象分析和设计的一种标准化表示法,包括类图、对象图、序列图、协作...
- **设计模式**:掌握常用的设计模式,如单例模式、工厂模式等,以提高代码的可复用性和可维护性。 - **最佳实践**:了解软件开发的最佳实践,如测试驱动开发(TDD)、持续集成(CI)等。 #### 四、Java中的OOP实现 1....
设计模式是解决常见问题的经过验证的解决方案,如工厂模式、单例模式、观察者模式等,它们为软件开发提供了通用的语言和框架。此外,书中还会介绍如何使用UML(统一建模语言)来可视化和沟通设计思想,包括类图、...
5. **设计模式**:面试中常见的Objective-C设计模式包括单例(Singleton)、工厂方法(Factory Method)、代理(Delegate)、观察者(Observer)、MVC(Model-View-Controller)架构等。理解这些模式如何在iOS开发中...
尽管C语言不直接支持OOP,但仍然可以应用一些设计模式,如工厂模式、单例模式等,来提高代码的可扩展性和可维护性。 8. **实践中的挑战** 使用C语言进行OOP时,需要注意内存管理、类型安全以及性能优化等问题。...
1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。这种模式适用于那些在整个应用程序中只需要一个实例的对象,例如日志记录器或配置管理器。 2. **容器模式**:这是一种抽象概念,用于表示能够...
这本书覆盖了多种经典的设计模式,如单例模式(Singleton)、抽象工厂模式(Abstract Factory)、责任链模式(Chain of Responsibility)和观察者模式(Observer)。同时,它还探讨了一些相对不太为人所熟知但同样...
在C中,可以利用静态变量来实现单例模式。静态变量具有程序生命周期内的唯一性和持久性,非常适合用于单例模式。例如: ```c typedef struct { int data; } Singleton; static Singleton* singleton_instance = ...
在iOS开发中,这通常通过使用设计模式如代理、工厂、单例和路由器来实现。 YHProxyRouter可能使用了代理模式,代理模式允许在对象间创建一种间接的通信方式,以降低类之间的耦合。在这个特定的库中,它可能是为了在...
- 高级面向对象设计模式的应用(如工厂模式、单例模式等)。 - UML图的应用与实践。 ##### 第8章:输入与输出处理 - **知识点**: - 文件操作的基本方法。 - 字符流与字节流的区别。 - 输入输出流的使用。 -...
本文实例讲述了go语言单例模式(Singleton)用法。分享给大家供大家参考。具体分析如下: 单例模式(Singleton):表示一个类只会生成唯一的一个对象。单例模式具有如下性质: A.这些类只能有一个实例; B.这些能够...
- 引导读者学习并应用设计模式,如工厂模式、单例模式、观察者模式等,以解决特定的问题域。 - 提供了实用的建议,帮助读者避免常见的编程陷阱和错误。 6. **性能优化技巧**: - 探讨了如何在编写C++代码时考虑...