我正在做一个项目,我想使用单例模式模型。我想要我这个项目的任何数据模型休闲单例模式。我研究了关于这个的苹果文档
和
http://www.oodesign.com/singleton-pattern.html
现在我知道我的自定义对象类应该遵循分配对象的主要规则,但是我需要完整的实现,比如使用这个类对象我是 iphone 应用程序开发的新手,所以如果我在这个问题的任何地方错了,请指导
我正在做一个项目,我想使用单例模式模型。我想要我这个项目的任何数据模型休闲单例模式。我研究了关于这个的苹果文档
和
http://www.oodesign.com/singleton-pattern.html
现在我知道我的自定义对象类应该遵循分配对象的主要规则,但是我需要完整的实现,比如使用这个类对象我是 iphone 应用程序开发的新手,所以如果我在这个问题的任何地方错了,请指导
尝试这个:
@implementation Singleton
+ (Singleton *)sharedInstance
{
static Singleton *obj = nil;
if (obj == nil)
obj = [[self alloc] init];
return obj;
}
@end
如果你可以针对iOS 4或更高版本,我会采取以下方式:
//.h
+(MySingletonClass *)mySharedInstance;
-(void)doSomething;
//.m
+(MySingletonClass *)mySharedInstance {
static dispatch_once_t pred;
static MySingletonClass *shared = nil;
dispatch_once(&pred, ^{
shared = [[MySingletonClass alloc] init];
});
return shared;
}
-(void)doSomething
{
}
// override also the init if you want
要访问它,请执行#import MySingletonClass.h
并在任何您想要的地方使用它,如下所示:
MySingletonClass* mySharedInstance = [MySingletonClass mySharedInstance];
[mySharedInstance doSomething];
我想要我这个项目的任何数据模型休闲单例模式。
根据我的经验,我不会滥用单身人士。应用程序可能变得难以维护。为避免这种情况,请将数据模型放在单例中。您可以直接访问数据模型(围绕它们创建属性)或使用公共方法(例如doSomething
)作为包装器。
希望这可以帮助。
static MyClass *_sharedInstance;
+ (MyClass *)sharedMyClass
{
@synchronized([MyClass class]) {
if (_sharedInstance == nil)
[[self alloc] init];
return _sharedInstance;
}
return nil;
}
+(id) alloc
{
@synchronized([MyClass class]) {
NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of MyClass.");
_sharedInstance = [super alloc];
return _sharedInstance;
}
return nil;
}
+ (id) allocWithZone:(NSZone *)zone
{
@synchronized([MyClass class]) {
NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of MyClass.");
_sharedInstance= [super allocWithZone:zone];
return _sharedInstance;
}
return nil; //on subsequent allocation attempts return nil
}
- (id) copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax;
}
- (oneway void)release
{
// Do nothing
}
- (id)autorelease
{
return self;
}
我用:
#import <Foundation/Foundation.h>
@interface iCode_Framework : NSObject
@property (readonly, nonatomic) unsigned int iBufCapacity;
@property (readonly, nonatomic) unsigned int iPort;
@property (readonly, nonatomic) NSString * urlStr;
@end
#import "iCode_Framework.h"
static iCode_Framework * instance;
@implementation iCode_Framework
@dynamic iBufCapacity;
@dynamic iPort;
@dynamic urlStr;
- (unsigned int)iBufCapacity
{
return 1024u;
};
- (unsigned int)iPort
{
return 1978u;
};
- (NSString *)urlStr
{
return @"localhost";
};
+ (void)initialize
{
if (!instance) {
instance = [[super allocWithZone:NULL] init];
}
}
+ (id)allocWithZone:(NSZone * const)notUsed
{
return instance;
}
@end
它的使用与普通类完全一样,您调用 alloc 和 init!分配给变量以给出简写通常很方便,因为 alloc 和 init 很长,例如:
#import "iCode_FrameworkTests.h"
#import "iCode_Framework.h"
static iCode_Framework * c;
@implementation iCode_FrameworkTests
+ (void)initialize
{
c = [[iCode_Framework alloc] init];
}
- (void)setUp
{
[super setUp];
// Set-up code here.
}
- (void)tearDown
{
// Tear-down code here.
[super tearDown];
}
- (void)testSingletonNotNil
{
STAssertNotNil(c, nil);
}
- (void)testSingletonProperty
{
STAssertEqualObjects(c, [iCode_Framework alloc], nil);
}
- (void)testIBufCapacity
{
STAssertEquals(c.iBufCapacity, 1024u, nil);
}
@end
这种方法的优点是它的使用与任何其他类完全一样,因此可以模拟进行测试。
通常我在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法并让它存在于该对象中。我使用宏将其提供给应用程序的其余部分:
#define APPLICATION ((AppDelegate*)([UIApplication sharedApplication].delegate))
作为应用程序委托的只读属性
如果您要进行模拟,这种方法的好处是它只是另一个对象属性,而不是隐藏的静态对象。