在objective-c中要實現一個單例類,至少需要做以下四個步驟:
1、為單例對象實現一個靜態執行個體,並初始化,然後設定成nil,
static MTNetworkEnvironment *g_instance = nil;
2、實現一個執行個體構造方法檢查上面聲明的靜態執行個體是否為nil,如果是則建立並返回一個本類的執行個體,
+ (MTNetworkEnvironment *)sharedInstance{ @synchronized(self) { if ( g_instance == nil ) { g_instance = [[self alloc] init]; } } return g_instance;}
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產生一個新執行個體,
+ (id)allocWithZone:(NSZone *)zone{ @synchronized(self){ if (g_instance == nil) { g_instance = [super allocWithZone:zone]; return g_instance; } } return nil;}
這裡的鎖適用於防止多線程,保證該操作只在一個線程中執行。
4、適當實現allocWitheZone,copyWithZone,release和autorelease。
標頭檔:
/** * @file MTNetworkEnvironment.h * @brief MoneyTree network environment * @author philiphu@mintcode.com * @date 2012-07-14 * @version 1.0.0 */#import <Foundation/Foundation.h>#import "Reachability.h"/** * @brief create and manage network enviroment */@interface MTNetworkEnvironment : NSObject/** * @brief get the signalton engine object * @return the engine object */+ (MTNetworkEnvironment *)sharedInstance;/** * @brief get the network statue */- (BOOL)isNetworkReachable;/** * @brief Judgment wifi is connected */- (BOOL)isEnableWIFI;/** * @brief To judge whether the 3G connection */- (BOOL)isEnable3G;@end
實現檔案:
/** * @file MTNetworkEnvironment.m * @brief MoneyTree network environment * @author philiphu@mintcode.com * @date 2012-07-14 * @version 1.0.0 */#import "MTNetworkEnvironment.h"@interface MTNetworkEnvironment(Private)@end@implementation MTNetworkEnvironmentstatic MTNetworkEnvironment *g_instance = nil;+ (id)allocWithZone:(NSZone *)zone{ @synchronized(self){ if (g_instance == nil) { g_instance = [super allocWithZone:zone]; return g_instance; } } return nil;}- (id)init{ self = [super init]; if (self) { } return self;}/** * @brief get the signalton engine object * @return the engine object */+ (MTNetworkEnvironment *)sharedInstance{ @synchronized(self) { if ( g_instance == nil ) { g_instance = [[self alloc] init]; } } return g_instance;}/** * @brief get the network statue */- (BOOL)isNetworkReachable{ BOOL isReachable = NO; Reachability *reachability = [Reachability reachabilityWithHostName:@"www.baidu.com"]; switch ([reachability currentReachabilityStatus]) { case NotReachable:{ isReachable = NO; } break; case ReachableViaWWAN:{ isReachable = YES; } break; case ReachableViaWiFi:{ isReachable = YES; } break; default: isReachable = NO; break; } return isReachable;}/** * @brief Judgment wifi is connected */- (BOOL)isEnableWIFI{ return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);}/** * @brief To judge whether the 3G connection */- (BOOL)isEnable3G{ return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);}@end