iOS开发单例类使用

开发中使用单例是在普通不过的一件事了,但是在使用时需要注意一些问题。很多时候我们都是习惯性的“拿来主义”——参考别人已有的代码直接用。没有去深究,往往在真出了问题之后才会注意到。

单例的销毁

一个单例创建很容易,但是销毁呢?单例为什么要销毁?准确的来说不是销毁,是置空属性。比如一个User的单例类,当用户退出登录后,里边的属性是要全部清理掉的。最一般的想法就是把单例的[User shareInstance]=nil,然后重新创建。但是这种办法无效。是的这种方法无效。技术上讲[User shareInstance]=nil这句代码会报不可赋值的错误。这个时候可能会自作聪明的声明一个变量引用它,然后变量在设置为nil。这里犯了想当然的指针和对象关系的错误。局部变量设置为nil就是不引用对象而已,不影响单例对象。正确的做法,需要实现一个方法,这样就需要把onceToken设置为全局变量了。也可以设置一个seNil方法,将单例类所有属性值置空

 static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
    });
+ (void)setNil
{
    instance = nil;
    onceToken = 0;
}

单例类创建

单例类的创建需要考虑的问题有,只创建一次线程安全类的构造方法创建对象返回单例类类的拷贝返回单例类
一般 dispatch_once(&onceToken, ^{});的做法保证了只创建一次和线程安全。类似于java风格的判断实例是否为nil的方法需要加上@synchronized{}保证线程安全。
重写allocWithZone和copyWithZone保证了后两者。不过一般注意的话,不需要这样。这样做严谨一些。

你可能感兴趣的:(iOS开发单例类使用)