A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 wxy19891017 于 2015-4-23 11:54 编辑

在iOS开发中,单例是最有用的设计模式之一。它是在代码间共享数据而不需要手动传递参数的一种最有用的方法。
使用下列代码实现一个单例类:
MyManager.h
#import<foundation/Foundation.h>
@interfaceMyManager : NSObject {
    NSString *someProperty;
}
@property(nonatomic, retain) NSString *someProperty;
+(id)sharedManager;
@end
MyManager.m
#import"MyManager.h"
@implementationMyManager
@synthesizesomeProperty;
#pragmamark Singleton Methods
+(id)sharedManager {
    static MyManager*sharedMyManager = nil;
    static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}
-(id)init {
  if (self = [super init]) {
      someProperty =[[NSString alloc] initWithString:@"Default Property Value"];
  }
  return self;
}
-(void)dealloc {
  // Should never be called, but jus there for clarity really.
}
@end
我们定义了一个静态变量叫做sharedMyManager,它在sharedManager方法中只会被实例化一次。通过GCD的dispath_once方法,我们确保sharedMyManager方法只会被创建一次。这是线程安全的,你无需担心什么。

但是,如果你不想用GCG,也可以这样实现sharedManager方法:
非-GCD 代码
+ (id)sharedManager {
    @synchronized(self) {
       if (sharedMyManager == nil)
           sharedMyManager = [[self alloc] init];
    }
    return sharedMyManager;
}
这样调用单例对象:
MyManager *sharedManager = [MyManager sharedManager];
在我的代码中,很多地方都使用了这样的代码。我用这些单例对象处理CoreLocation或CoreData。
非ARC代码
如果你不使用ARC(不建议),则应该使用下列代码:

MyManager.h (非ARC)

#import "MyManager.h"
static MyManager *sharedMyManager = nil;
@implementation MyManager
@synthesize someProperty;
#pragma mark Singleton Methods
+ (id)sharedManager {
  @synchronized(self) {
     if(sharedMyManager == nil)
         sharedMyManager = [[super allocWithZone:NULL] init];
  }
  return sharedMyManager;
}
+ (id)allocWithZone:(NSZone *)zone {
  return [[self sharedManager]retain];
}
- (id)copyWithZone:(NSZone *)zone {
  return self;
}
- (id)retain {
  return self;
}
- (unsigned)retainCount {
  return UINT_MAX; //denotes anobject that cannot be released
}
- (oneway void)release {
  // never release
}
- (id)autorelease {
  return self;
}
- (id)init {
  if (self = [super init]) {
     someProperty = [[NSString alloc] initWithString:@"Default PropertyValue"];
  }
  return self;
}
- (void)dealloc {
  // Should never be called,but just here for clarity really.
  [someProperty release];
  [super dealloc];
}
@end
所谓单例,即我们自己创建一个单例类,该类只能生成唯一的对象,即用  if (sharesingleton == nil)    方法来保证唯一性,为了防止该对象被复制(copy)或者retain 和 release 等操作,我们必须在所创建的单例的实现文件( .m 文件)中将父类的这些方法给覆盖,该目的是为了保证单例模式的一个严谨性。

ARC下创建个简单地单例对象挺简单地,我记下的是第一种方法。其实还是不甚了解其中的方法。等慢慢以后再去了解吧。现在暂时先懂怎么创建单例对象就好了,先把考试考过!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马