不务正业之OC(十二) 单例设计模式

单例设计模式:只能创建一个实例

什么时候创建单例:
1、单例对象作为全局数据,可以为其他对象访问
2、如果创建对象时,需要init要做很多事情,那么创建单例可以提高性能

创建单例步骤:
1、创建一个对象的静态实例,初始化为nil
2、当类的实例为nil时,创建类工厂方法
3、覆盖allocWithZone方法,alloc时不会产生新对象
4、实现NSCopying协议,覆盖release、autorelease、retain、retainCount方法,确保单例
5、多线程情况下,@synchronized,保证单例正确初始化

//  Lijie.h
//  Single
 
#import <Foundation/Foundation.h>
 
@interface Lijie : NSObject<NSCopying>
 
@property(nonatomic,retain) NSNumber *age;
@property(nonatomic,retain) NSString *sex;
 
+ (id)sharePerson;
 
@end
 
//  Lijie.m
//  Single
 
#import "Lijie.h"
 
static Lijie *singleLijie = nil;
 
@implementation Lijie
 
+ (id)sharePerson{
    @synchronized(self){
        if (singleLijie == nil) {
            singleLijie = [[[self class] alloc] init];
        }
        return singleLijie;
    }
}
 
+ (id) allocWithZone:(NSZone *)zone{
    if (singleLijie == nil) {
        singleLijie = [super allocWithZone:zone];
    }
    return singleLijie;
}
 
- (id)copyWithZone:(NSZone *)zone{
    return singleLijie;
}
 
- (id)retain{
    return singleLijie;
}
 
- (oneway void)release{
}
 
- (id)autorelease{
    return singleLijie;
}
 
- (NSUInteger) retainCount{
    return UINT_MAX;
}
 
 
@end
 
//  main.m
//  Single
 
#import <Foundation/Foundation.h>
#import "Lijie.h"
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        Lijie *lijie = [Lijie sharePerson];
 
        Lijie *lijie1 = [[Lijie alloc] init];
        Lijie *lijie2 = [Lijie sharePerson];
        Lijie *lijie3 = [lijie1 copy];
 
        [lijie release];
        [lijie release];
        [lijie release];
        [lijie release];
        [lijie release];
        NSLog(@"");//这里搞个breakpoint可以观察lijie1、lijie2、lijie3三个对象地址
    }
    return 0;
}

1


Post a Comment