1

我正在做一个项目,我想使用单例模式模型。我想要我这个项目的任何数据模型休闲单例模式。我研究了关于这个的苹果文档

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 应用程序开发的新手,所以如果我在这个问题的任何地方错了,请指导

4

6 回答 6

2

尝试这个:

@implementation Singleton

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

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

    return obj;
}

@end
于 2012-07-13T12:04:19.467 回答
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];

我想要我这个项目的任何数据模型休闲单例模式。

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

希望这可以帮助。

于 2012-07-13T13:09:35.043 回答
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;
}
于 2012-07-13T12:06:08.943 回答
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

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

于 2012-07-14T23:38:27.320 回答
0

通常我在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

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

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

作为应用程序委托的只读属性

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

于 2012-07-13T13:02:05.137 回答
0

这可能是一个有用的参考:http ://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html

于 2012-07-13T12:05:55.793 回答