您的位置:首页 > 移动开发 > IOS开发

iOS中的单实例的实现

2011-11-17 16:06 155 查看
我们知道在Cocoa Touch框架中有许多类是以单实例方式存在的,例如:UIApplication, NSUserDefault, UIDevice, NSFileManager等等; 当我们使用这些类的时候,我们得到的实例永远是同一个。今天我就将我不久之前实现的一个单实例类介绍给大家:

类名:Carrier (运营商)

作用:提供一些有关运营商的信息。

//
// Carrier.h
// Carrier Information
//
#import <Foundation/Foundation.h>

@interface Carrier : NSObject {
@private
NSString *_carrierName; // 运营商名称(中国移动、中国联通)
NSString *_carrierCode; // 运营商国际编码(中国移动:46000,46002 中国联通:46001)
NSString *_carrierServiceNumber; // 运营商服务热线(中国移动:10086 中国联通:10010)
}

@property (nonatomic, readonly) NSString *carrierName;
@property (nonatomic, readonly) NSString *carrierCode;
@property (nonatomic, readonly) NSString *carrierServiceNumber;

+ (id)currentCarrier;

@end

//
// Carrier.m
// Carrier Information
//

#import "Carrier.h"

#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

static Carrier *carrier = nil;

@implementation Carrier
@synthesize carrierName = _carrierName;
@synthesize carrierCode = _carrierCode;
@synthesize carrierServiceNumber = _carrierServiceNumber;

+ (id)currentCarrier {
@synchronized(self) {
if (carrier == nil) {
carrier = [[Carrier alloc] init];
}
}
return carrier;
}

- (id)init {
self = [super init];
if (self) {
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
_carrierName = [[NSString alloc] initWithString:info.subscriberCellularProvider.carrierName];
NSMutableString *mutableString = [[NSMutableString alloc] initWithString:info.subscriberCellularProvider.mobileCountryCode];
[mutableString appendString:info.subscriberCellularProvider.mobileNetworkCode];
_carrierCode = mutableString;

if ([mutableString isEqualToString:@"46001"]) {
_carrierServiceNumber = [[NSString alloc] initWithString:@"10010"];
} else if ([mutableString isEqualToString:@"46000"] || [_carrierCode isEqualToString:@"46002"]) {
_carrierServiceNumber = [[NSString alloc] initWithString:@"10086"];
} else {
_carrierServiceNumber = [[NSString alloc] initWithString:NSLocalizedString(@"Unknow Carrier", @"")];
}
[info release];
}

return self;
}

+ (id)allocWithZone:(NSZone *)zone{
@synchronized(self) {
if (carrier == nil) {
carrier = [super allocWithZone:zone];
return carrier;
}
}
return nil;
}

- (void)dealloc {
[_carrierName release];
[_carrierCode release];
[_carrierServiceNumber release];
[super dealloc];
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

- (id)retain {
return self;
}

- (oneway void)release {

}

- (id)autorelease {
return self;
}

- (NSUInteger)retainCount {
return NSUIntegerMax;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

- (id)copyWithZone:(NSZone *)zone {
return self;
}

@end

iOS中的单利编程是十分必要的,它可以为我们节省很多系统资源,所以我们认为在必要的时候我们要使用单实例设计模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: