博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS单例
阅读量:6324 次
发布时间:2019-06-22

本文共 1988 字,大约阅读时间需要 6 分钟。

转自:http://blog.csdn.net/yangzychina/article/details/9305533

最近在面试,有些总是会被问到,突然觉得自己虽然做了有一年多的iOS,也自己开发过几款应用,但是有些基础终究感觉自己狠模糊。
从现在起开始看中基础,理论。

 
被问到的两个比较多的问题, 单例以及什么是KVO和KVC。
首先说单例模式。
 
单例的概念(Singleton): 创建某类对象时,无论创建多少次该类对象只有一份在内存中,通俗的将就是只存在这个类的一个势力对象。
在iOS中,有两种单例实现模式,以下为例子。
1.使用 static 管理
@interface Singleton:NSObject
 
@end
 
@implement

static Singleton*sharedSingleton= nil;

+(Singleton*) sharedInstance{ 

 
  @synchronized(self)
  {     
     if (sharedSingleton== nil)
     {          
        sharedSingleton= [[Singleton alloc] init];       
     }   
  }
  return sharedSingleton; 
}

+(id) allocWithZone:(NSZone *)zone

{   
   @synchronized(self)
   {       
      if (sharedSingleton== nil)
     {   
        sharedSingleton= [super allocWithZone:zone];     
         returnsharedSingleton;      
     }
   }   
   return nil; 
}

- (id)copyWithZone:(NSZone *)zone{

return self;

}

 

-(id)retain{

return self;

}

- (void)release{

//do nothing

}

-(id)autorelease{

return self;

}

@end

 

 

使用synchronized()可以防止多个线程同时执行该段代码(线程锁)

NSZone: 简单来说可以把它想象成一个内存池,alloc或者dealloc这些操作都是在这个内存池中操作的,cocoa总是会分配一个默认的NSZone,任何 默认内存操作都是在这个zone上进行的,使用默认zone存在缺陷,因为他是全局范围的,频繁使用会导致内存的碎片化,尤其是大量的alloc和 dealloc的时候,性能上会受到一定影响。因为你可以自己生成一个zone并将alloc,copy这些限制在这个zone中。

 

第二种是使用 GCD,不用synchronized,比较官方的例子

 

@implement

static Singleton*sharedSingleton= nil;

+(Singleton*) sharedInstance{ 

static dispatch_once_t onceToken;

dispatch_once(&onceToken,^{

sharedSingleton = [super allocWithZone:nil] init];

}

return instance;

}

 

 

+(id) allocWithZone:(NSZone*)zone {
return[self sharedInstance];}

 

 

@end

 

以下是苹果官方的例子。

 

 

static MyGizmoClass *sharedGizmoManager = nil;
 
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager;
}
 
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedManager] retain];
}
 
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
 
- (id)retain
{
return self;
}
 
- (NSUInteger)retainCount
{
return NSUIntegerMax;  //denotes an object that cannot be released
}
 
- (void)release
{
//do nothing
}
 
- (id)autorelease
{
return self;
}

 

 

如果人家让你写单例,你能够准确无误的写出单例,肯定会成功率比较高。加油

你可能感兴趣的文章
route命令
查看>>
用 cgroups 管理 cpu 资源
查看>>
MySQL各版本特性及其价格
查看>>
11g新特性:RDBMS Component TRACE
查看>>
jquery 修改排序
查看>>
Iterator接口
查看>>
嵌入式开发的学习步骤及入门
查看>>
决心书
查看>>
Oracle 基础篇 --- B树索引内部结构
查看>>
centos7 Tab键之后yum不自动补全解决
查看>>
RTB价格加解密
查看>>
day13-LNMP、FASTCGI
查看>>
容器操作使迭代器失效
查看>>
成为专业程序员路上用到的各种优秀资料、神器及框架
查看>>
将input或textarea设置为disabled的样式问题
查看>>
HDU 2017 多校联合Contest 3
查看>>
Mysqlreport总结
查看>>
Ubuntu14.04忘记root密码的解决方法
查看>>
JS中解决中文乱码的2种方法
查看>>
C语言学习大纲
查看>>