我们知道在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;}@endiOS中的单利编程是十分必要的,它可以为我们节省很多系统资源,所以我们认为在必要的时候我们要使用单实例设计模式。