Objective-C相关

单例

第一步

必不可少的。但注意,这里用的是super来调用allocWithZone::

1
2
3
4
5
6
7
8
9
10
+ (instancetype)sharedSingleton {
static Singleton *_sharedSingleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//不能再使用alloc方法
//因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
_sharedSingleton = [[super allocWithZone:NULL] init];
});
return _sharedSingleton;
}

第二步

防止alloc] init]new引起的错误,因为alloc] init]new实际是一样的工作原理, 都是执行了下面方法:

1
2
3
4
// 防止外部调用alloc 或者 new
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [Singleton sharedSingleton];
}

第三步 NSCopying

防止copy引起的错误,个人感觉当你的单例类不遵循NSCopying协议,外部调用本身就会出错。如果不是业务需求不遵循协议,该方法也可以不写。这都是个人观点,不过为了严谨还是写吧

1
2
3
4
// 防止外部调用copy
- (id)copyWithZone:(nullable NSZone *)zone {
return [Singleton sharedSingleton];
}

第四步

防止mutableCopy引起错误,个人感觉当单例类不遵循NSMutableCopying协议,外部调用本身就会出错。如果不是业务需求不遵循协议,该方法也可以不写。这都是个人观点,不过为了严谨还是写吧

1
2
3
4
// 防止外部调用mutableCopy
- (id)mutableCopyWithZone:(nullable NSZone *)zone {
return [Singleton sharedSingleton];
}

id与instancetype的区别

instancetype能返回相关联的类型(使那些非关联返回类型的方法返回所在类的类型);而id 返回的类型依旧是id类型。
instancetype只能做返回值,不能做参数;而id表示任意类型,既可以做返回值也可以做参数。
(使用Instancetype的好处是能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题。)

数据持久化

见iOS数据存储方式一文。