当一个类被多次复用时,需要保证该类只有一个唯一的实例,这样不会重复开辟该类的多个内存。
使用 GCD 单例编写方式
+ (instancetype) sharedUserObject{
static LPUserObject *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[LPUserObject alloc]init];
});
return instance;
}
存在问题:
如果采用sharedCodeService
方式调用单例是不会创建新的内存的,但如果引用alloc
、copy
还是会开辟新的内存,达不到单例的效果。
GCD 补充完善
[[Class alloc] init],做了两件事。 alloc 给对象分配内存空间,init是对对象的初始化,包括设置成员变量初值这些工作。而给对象分配空间,除了alloc方法之外,还有另一个方法: allocWithZone.NSZone是Apple用来分配和释放内存的一种方式,它不是一个对象,而是使用C结构存储了关于对象的内存管理的信息。cocoa Application使用一个系统默认的NSZone来对应用的对象进行管理。大量对象的释放可能会导致内存严重碎片化,cocoa本身有做过优化,每次alloc的时候会试图去填满内存的空隙,但是这样做的话时间的开销很大。
@interface LPUserObject()<NSCopying,NSMutableCopying>
@end
@implementation LPUserObject
+ (instancetype) sharedUserObject{
static LPUserObject *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// instance = [[LPUserObject alloc]init];
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
return [LPUserObject sharedUserObject];
}
- (id)copyWithZone:(NSZone *)zone{
return [LPUserObject sharedUserObject];
}
- (id)mutableCopyWithZone:(NSZone *)zone{
return [LPUserObject sharedUserObject];
}