ios单例模式

                本章主要讲的是单例模式,对于单例模式就是指一个类只能创建一个对象,我们的编程中经常会用到单例模式,可能我们自已都不知道,如NSUserDefault, UIApplication等,这两种都是系统封装好了的。下面主要来讲我们自已手动构建自已的单例

        构建单例,分为两种 ,

       一种是非GCD,

#import <Foundation/Foundation.h>
@interface BuyUser : NSObject
@property(nonatomic,retain)NSString* userID;
@property(nonatomic,retain)NSString *userAvatar;
@property(nonatomic,retain)NSString *userNickname;
@property(nonatomic,retain)NSString *userSex;
@property(nonatomic,retain)NSString *userSource;
@property(nonatomic,retain)NSString* userCode;
@property BOOL isLoggedIn;
+(BuyUser *)shareUser;
@end

#import "BuyUser.h"
static BuyUser* shareUserInstance=nil;
@implementation BuyUser
@synthesize userID;
@synthesize userAvatar;
@synthesize userSex;
@synthesize userNickname;
@synthesize userSource;
@synthesize userCode;
@synthesize isLoggedIn;
+(BuyUser *)shareUser
{
   //这里的synchronized是用于多线程的,{ }内的代码限制在一个线程执行,如果某个线程 没执行完,其他的线和如果需要执行就得等着。
    @synchronized(self){
        if (shareUserInstance==nil) {
           [[self alloc] init];
        }
    }
    return shareUserInstance;
}
//这个方法是重写的,因为这个是从制定的内存区域读取信息创建实例,所以如果需要的单例已经有了,就需要禁止修改当前单例
+(id)allocWithZone:(NSZone *)zone
{
    @synchronized(self){
        if (shareUserInstance==nil) {
            shareUserInstance=[super allocWithZone:zone];
            return shareUserInstance;
        }
    }
    return nil;
}
-(id)copyWithZone:(NSZone *)zone
{
    return self;
}
-(id)retain
{
    return self;
}
-(unsigned)retainCount
{
    return UINT_MAX;
}
-(oneway void)release
{
    //do nothing
}
-(id)autorelease
{
    return self;
}


-(void)dealloc
{
    self.userID=nil;
    self.userAvatar=nil;
    self.userSex=nil;
    self.userNickname=nil;
    self.userSource=nil;
    self.userCode=nil;
    [super dealloc];
}
@end


另一种方法是针对ios4.0以 ,使用GCD,如

+(BuyUser *)shareUser
{
   static BuyUser* shareUserInstance=nil;
   static dispatch_one_t onceToken;
   dispatch_one(&oneToken,^{
    shareUserInstance=[[self alloc] init];
   });
   return shareUserInstance;
}


当然,我们使用的时候就直接用

    BuyUser* user=[BuyUser shareUser];


这时的user可以在整个应用中进行数据共享,和NSUserDefault差不多。

有什么问题请大家多多指教



你可能感兴趣的:(ios单例模式)