static MyClass *class = nil;
@implementation MyClass
+(MyClass *)sharedMyClass{
@synchronized(self){ //爲了確保多線程情況下,仍然確保實體的唯一性
if (!class) {
[[self alloc] init]; //該方法會調用 allocWithZone
}
}
return class;
}
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){// //爲了確保多線程情況下,仍然確保實體的唯一性
if (!class) {
class = [super allocWithZone:zone]; //確保使用同一塊內存地址
return class;
}
}
return nil;
}
-(id)init
{
if(class){
return class;
}
if(self = [super init]){
//進行一些初始化
}
return self ;
}
- (id)copyWithZone:(NSZone *)zone;{
return self; //確保copy對象也是唯一
}
-(id)retain{
return self; //確保計數唯一
}
- (unsigned)retainCount
{
return UINT_MAX; //裝逼用的,這樣打印出來的計數永遠爲-1
}
- (id)autorelease
{
return self;//確保計數唯一
}
- (oneway void)release
{
//重寫計數釋放方法 do nothing
}
@end
@interface SomeManager : NSObject
+ (id)sharedManager;
@end
/* 非線程安全的實現 */
@implementation SomeManager
+ (id)sharedManager {
static id sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[self alloc] init];
}
return sharedManager;
}
@end
/* 線程安全的實現 */
@implementation SomeManager
static id sharedManager = nil;
+ (void)initialize {
if (self == [SomeManager class]) {
sharedManager = [[self alloc] init];
}
}
+ (id)sharedManager {
return sharedManager;
}
@end
+(SchoolManager *)sharedInstance
{
__strong static SchoolManager *sharedManager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[SchoolManager alloc] init];
});
return sharedManager;
}