ios之单例类的实现(封堵alloc release retain 等方法)

#import "Superman.h"

static Superman *superman = nil;// 定义全局静态变量

@implementation Superman

// 重写alloc 方法封堵创建方法(调用alloc方法时默认会走allocWithZone这个方法 所以只需封堵allocWithZone 方法即可)
+ (id)allocWithZone:(struct _NSZone *)zone
{
    if (!superman) {
        superman = [super allocWithZone:zone];//如果没有实例让父类去创建一个
        return superman;
    }
    return nil;
}

+ (Superman *)shareSuperman  //定义一个类方法进行访问(便利构造)
{
    if (!superman) {
        superman = [[Superman alloc]init];// 如果实例不存在进行创建
    }
    return superman;
}
- (id)retain //封堵retain 方法 单例不能被其他对象持有
{
    return self;
}
- (oneway void)release // 封堵release 方法 (让单例不被释放)
{
    
}
- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}
// 封堵深复制 (copy 和 mutablecopy 都可以实现深复制 但他们最终都需要调用copyWithZone方法所以直接封堵它)
- (id)copyWithZone:(struct _NSZone *)zone
{
    return self;
}

@end


你可能感兴趣的:(IOS开发实用技巧)