扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一、静态指针方式(单线程模式单例)
创新互联公司于2013年创立,先为甘肃等服务建站,甘肃等地企业,进行企业商务咨询服务。为甘肃企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
二、多线程加锁单例
三、单例的健壮性
由于水平有限,难免出现纰漏,如有问题还请不吝赐教。
为你解答。
第一、基本概念
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。
第二、在IOS中使用单例模式的情况
1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间
2.在IOS开发中,如果很多模块都要使用同一个变量,此时如果把该变量放入单例类,则所有访问该变量的调用变得很容易,否则,只能通过一个模块传递给另外一个模块,这样增加了风险和复杂度
第三、创建单例模式的基本步骤
1.声明一个单例对象的静态实例,并初始化为nil
2.声明一个类的工厂方法,生成一个该类的实例,并且只会生成一个
3.覆盖allcoWithZone方法,确保用户在alloc 时,不会产生一个多余的对象
4.实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以确保只有一个实例化对象
5.在多线程的环境中,注意使用@synchronized关键字
[cpp] view plaincopyprint?
//
// UserContext.h
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import Foundation/Foundation.h
@interface UserContext : NSObject
@property (nonatomic,retain) NSString *username;
@property(nonatomic,retain)NSString *email;
+(id)sharedUserDefault;
@end
[cpp] view plaincopyprint?
//
// UserContext.m
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import "UserContext.h"
static UserContext *singleInstance=nil;
@implementation UserContext
+(id)sharedUserDefault
{
if(singleInstance==nil)
{
@synchronized(self)
{
if(singleInstance==nil)
{
singleInstance=[[[self class] alloc] init];
}
}
}
return singleInstance;
}
+ (id)allocWithZone:(NSZone *)zone;
{
NSLog(@"HELLO");
if(singleInstance==nil)
{
singleInstance=[super allocWithZone:zone];
}
return singleInstance;
}
-(id)copyWithZone:(NSZone *)zone
{
NSLog(@"hello");
return singleInstance;
}
-(id)retain
{
return singleInstance;
}
- (oneway void)release
{
}
- (id)autorelease
{
return singleInstance;
}
- (NSUInteger)retainCount
{
return UINT_MAX;
}@end
[cpp] view plaincopyprint?
#import Foundation/Foundation.h
#import "UserContext.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
UserContext *userContext1=[UserContext sharedUserDefault];
UserContext *userContext2=[UserContext sharedUserDefault];
UserContext *userContext3=[[UserContext alloc] init];
UserContext *userContext4=[userContext1 copy];
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
在开发中我们可以利用ios提供的方法来实现单例模式:
SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);
将该语句置于@implementation MyClassName声明后,这样你的类自动会变成单例。
内容来自于richard_如风的博客。
iOS开发就是为装有iOS系统的设备完成应用软件或游戏软件的开发,ios开发的设计模式有代理模式、观察者模式、MVC模式、单例模式、策略模式和工厂模式。
在数学和逻辑学中,单例定义为” 有且仅有一个元素的集合 “,在无论什么情况下,获取到的都是同一个值。在程序中,单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。这个方法应该是类方法,阻止所有想要生成对象的访问,避免一个全局使用的类频繁地创建和销毁。
static uniqueInstance 是 Singleton 中的唯一实例, static sharedInstance 将它返回给客户端。通常, shareInstance 会检查 uniqueInstance 是否已经被实例化,如果没有,会生成一个实例然后返回 uniqueInstance 。
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
只要应用程序需要集中式的类来协调其服务,这个类就应该生成单一的实例,而不是多个实例。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流