`
sgm881218
  • 浏览: 58304 次
社区版块
存档分类
最新评论

Object-c中的单例模式

    博客分类:
  • ios
阅读更多

 

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“之内。

 

 

  • 大小: 222 KB
  • 大小: 144.9 KB
  • 大小: 65.3 KB
1
0
分享到:
评论

相关推荐

    Object-C基础教程

    类方法常用于初始化、单例模式等场景。 ### 6. 内存管理(ARC) Objective-C的自动引用计数(Automatic Reference Counting, ARC)负责对象的内存管理。当对象的引用计数为0时,系统会自动释放该对象,避免内存...

    一般Object-C的编码规范指南

    - **单例模式**:在创建单例对象时,应确保线程安全。 - **导入**:在导入系统框架时,应使用尖括号`<...>`,而在导入自定义文件时应使用双引号`"..."`。 ### 总结 这些规范的遵循不仅能够保证代码的一致性,也...

    Object-Oriented Programming With ANSI-C

    这在C中通常称为“设计模式”,如工厂模式、单例模式等。 6. 动态内存分配:在C中,面向对象编程通常需要动态内存分配来创建对象实例。通过`malloc`和`free`函数来分配和释放内存,但需要注意内存泄漏和悬挂指针的...

    Object-C-Object-C编程规范.zip

    Objective-C,简称ObjC,是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,具有Smalltalk风格的消息传递机制。Objective-C主要用于iOS和macOS应用开发,是Apple平台的标准开发语言。本资料“Object-C/...

    Object-C复习_object-c_复习_

    - **Singleton**:单例模式,确保一个类只有一个实例。 - **Delegate**:代理模式,用于对象间的通信。 ### 9. Xcode工具 - **Xcode IDE**:Apple官方的开发工具,集成了代码编辑、调试、构建等功能。 - **...

    Object-c 基础详解.docx

    例如,可以定义一个静态全局变量来保存单例对象的引用,从而实现单例模式。 #### 隐藏与封装 - **概念**:封装是一种设计原则,目的是隐藏对象的内部状态,并通过公开的接口来提供对这些状态的操作。这是面向对象...

    Object_C编程之道iOS设计模式解析

    1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。在iOS中,单例常用于管理网络请求(如NSURLSessionConfiguration)、用户首选项(NSUserDefaults)或全局状态(如App Delegate)。 2. *...

    面向对象软件构造object-oriented software construction

    例如,工厂模式用于创建对象,单例模式确保一个类只有一个实例,观察者模式用于实现对象间的发布-订阅通信。 6. UML(统一建模语言):UML是面向对象分析和设计的一种标准化表示法,包括类图、对象图、序列图、协作...

    Java中的面向对象编程Object-Oriented Programming in Java

    - **设计模式**:掌握常用的设计模式,如单例模式、工厂模式等,以提高代码的可复用性和可维护性。 - **最佳实践**:了解软件开发的最佳实践,如测试驱动开发(TDD)、持续集成(CI)等。 #### 四、Java中的OOP实现 1....

    Head First Object-Oriented Design and Analysis

    设计模式是解决常见问题的经过验证的解决方案,如工厂模式、单例模式、观察者模式等,它们为软件开发提供了通用的语言和框架。此外,书中还会介绍如何使用UML(统一建模语言)来可视化和沟通设计思想,包括类图、...

    object-c面试小抄

    5. **设计模式**:面试中常见的Objective-C设计模式包括单例(Singleton)、工厂方法(Factory Method)、代理(Delegate)、观察者(Observer)、MVC(Model-View-Controller)架构等。理解这些模式如何在iOS开发中...

    Object-Oriented-Programming-in-C.rar_perspective

    尽管C语言不直接支持OOP,但仍然可以应用一些设计模式,如工厂模式、单例模式等,来提高代码的可扩展性和可维护性。 8. **实践中的挑战** 使用C语言进行OOP时,需要注意内存管理、类型安全以及性能优化等问题。...

    Data Structures And Algorithms With Object-Oriented Design Patterns In C Sharp.pdf

    1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。这种模式适用于那些在整个应用程序中只需要一个实例的对象,例如日志记录器或配置管理器。 2. **容器模式**:这是一种抽象概念,用于表示能够...

    Pro-Objective-C-Design-Patterns-for-iOS

    这本书覆盖了多种经典的设计模式,如单例模式(Singleton)、抽象工厂模式(Abstract Factory)、责任链模式(Chain of Responsibility)和观察者模式(Observer)。同时,它还探讨了一些相对不太为人所熟知但同样...

    swift-YHProxyRouter一个用Object-C写的实现多继承而且解耦功能强大的工具

    在iOS开发中,这通常通过使用设计模式如代理、工厂、单例和路由器来实现。 YHProxyRouter可能使用了代理模式,代理模式允许在对象间创建一种间接的通信方式,以降低类之间的耦合。在这个特定的库中,它可能是为了在...

    Beginning Java Programming The Object-Oriented Approach-Wrox (2015)

    - 高级面向对象设计模式的应用(如工厂模式、单例模式等)。 - UML图的应用与实践。 ##### 第8章:输入与输出处理 - **知识点**: - 文件操作的基本方法。 - 字符流与字节流的区别。 - 输入输出流的使用。 -...

    go语言单例模式(Singleton)实例分析

    本文实例讲述了go语言单例模式(Singleton)用法。分享给大家供大家参考。具体分析如下: 单例模式(Singleton):表示一个类只会生成唯一的一个对象。单例模式具有如下性质: A.这些类只能有一个实例; B.这些能够...

    Real time C++ Efficient Object-Oriented and Template Microcontroller Programming

    - 引导读者学习并应用设计模式,如工厂模式、单例模式、观察者模式等,以解决特定的问题域。 - 提供了实用的建议,帮助读者避免常见的编程陷阱和错误。 6. **性能优化技巧**: - 探讨了如何在编写C++代码时考虑...

Global site tag (gtag.js) - Google Analytics