share方法
+ (instancetype)sharePerson
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [[self alloc] init];
});
return _person;
}
alloc方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_person = [super allocWithZone:zone];
});
return _person;
}
copy方法
- (id)copyWithZone:(NSZone *)zone
{
return _person;
}
代码如下:
//.h文件
#define LYPSingletonH(name) + (instancetype)share##name;
//.m文件
#define LYPSingletonM(name) \
static id _instance; \
\
+ (instancetype)share##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instance; \
}
注意事项
实现代码如下
static Dog *_dog;
+ (instancetype)shareDog
{
@synchronized(self)
{
if (_dog == nil)
{
[NSThread sleepForTimeInterval:3];
_dog = [[self alloc] init];
}
}
return _dog;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
@synchronized(self)
{
if (_dog == nil)
{
[NSThread sleepForTimeInterval:3];
_dog = [super allocWithZone:zone];
}
}
return _dog;
}
- (id)copyWithZone:(NSZone *)zone
{
return _dog;
}
注意事项
1.单例模式不能使用继承实现,否则所有子类创建的对象都将是第一个创建的对象