如何在我的IPhone项目中实现Singleton Pattern?

时间:2012-07-13 12:00:52

标签: iphone objective-c ios design-patterns singleton

我正在开展一个项目,我想使用Singleton Pattern模型。 我希望我的这个项目的任何数据模型休闲单身模式。 我研究了关于这个的苹果文档

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html#//apple_ref/doc/uid/TP40002974-CH6-SW6

http://www.oodesign.com/singleton-pattern.html

http://www.daveoncode.com/2011/12/19/fundamental-ios-design-patterns-sharedinstance-singleton-objective-c/

现在我知道我的自定义对象类应该放弃分配对象的主要规则但是我需要完整的实现,比如使用这个类对象 我是iphone app开发的新手,所以如果我在这个问题的任何地方出错,请指导

6 个答案:

答案 0 :(得分:2)

试试这个:

@implementation Singleton

+ (Singleton *)sharedInstance
{
     static Singleton *obj = nil;

    if (obj == nil)
        obj = [[self alloc] init];

    return obj;
}

@end

答案 1 :(得分:1)

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;
}

答案 2 :(得分:1)

如果您可以定位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];
  

我希望我的这个项目的任何数据模型都可以使用Singleton Pattern。

根据我的经验,我不会滥用单身人士。应用程序可能难以维护。为避免这种情况,请将数据模型放在单例中。您可以直接访问数据模型(围绕它们创建属性)或使用公共方法(例如doSomething)作为包装器。

希望这有帮助。

答案 3 :(得分:0)

答案 4 :(得分:0)

通常我会在

中创建对象
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

方法并让它存在于该对象中。我使用宏将其提供给应用程序的其余部分:

#define APPLICATION ((AppDelegate*)([UIApplication sharedApplication].delegate))

作为app delegate的只读属性

如果你进行模拟,这种方法的好处是它只是另一个对象属性而不是隐藏的静态对象。

答案 5 :(得分:0)

我用:

#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

这种方法的优点是它与任何其他类一样使用,因此可以进行模拟测试。