有关SharedInstance的问题

时间:2011-04-08 08:13:24

标签: objective-c ios4 iphone-sdk-3.0

嘿伙计们,我想问,什么是shareInstance实际上?我的意思是用法是什么?

目前我在两个不同文件之间进行通信时遇到了一些问题。

这是我的问题: 我有一个文件调用A.h / A.m和另一个文件调用B.h / B.m. A.h需要访问B.h中的一些数据,所以......有什么方法可以实现我想要的东西吗? 只是想知道它是“SharedInstance”能够解决我的问题吗?

寻找回复:))

4 个答案:

答案 0 :(得分:10)

sharedInstance可用于多种方式。

例如,您可以从静态上下文访问对象。实际上它用于支持Singleton模式的大多数方法。 这意味着只需要在整个程序代码中使用该类的一个对象,只需要一个实例。

界面可以如下所示:

@interface ARViewController
{
}
@property (nonatomic, retain) NSString *ARName;

+ (ARViewController *) sharedInstance;

实现ARViewController:

@implementation ARViewController
static id _instance
@synthesize ARName;
...
- (id) init
{
    if (_instance == nil)
    {
        _instance = [[super allocWithZone:nil] init];
    }
    return _instance;
}

+ (ARViewController *) sharedInstance
{
    if (!_instance)
    {
        return [[ARViewController alloc] init];
    }
    return _instance;
}

要访问它,请在CustomARFunction类中使用以下内容:

#import "ARViewController.h"

@implementation CustomARFunction.m

- (void) yourMethod
{
    [ARViewController sharedInstance].ARName = @"New Name";
}

答案 1 :(得分:7)

共享实例是一个过程,您可以通过该过程在项目中的任何位置访问类的同一实例或对象。这背后的主要思想是每次调用一个方法时返回相同的对象,以便存储在实例中的值/属性可以在应用程序的任何地方使用。

这可以通过以下2个简单过程完成: -

1)使用仅初始化一次的静态变量

@implementation SharedInstanceClass

static SharedInstanceClass *sharedInstance = nil;

+ (id)sharedInstanceMethod
{
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [SharedInstanceClass new];
        }
    }
    return sharedInstance;
}

@end

2)使用GCD: -

+ (id)sharedInstance{
    static dispatch_once_t onceToken;
    static SharedInstanceClass *sharedInstance = nil;
    dispatch_once(&onceToken, ^{
        sharedInstance = [SharedInstanceClass new];
    });
    return sharedInstance;
}

这些必须被称为: -

SharedInstanceClass *instance = [SharedInstanceClass sharedInstance];

因此,每次从函数返回相同的实例,设置为属性的值将被保留,并且可以在应用程序的任何位置使用。

此致

答案 2 :(得分:3)

通常使用singleton pattern实现sharedInstance。就像在[UIApplication sharedApplication] - >中一样您只能通过此单例访问一个应用程序。

这个想法是让一个类的一个实例可以通过调用类方法来访问,在objective-c中通常名为sharedXXX。

要解决您的问题,您实际上可以实现模型类的单例,并从一个可以使用静态方法访问的现有实例中写入和访问日期,我们称之为sharedModel。

改进模型和更新视图的下一步是KVO:Key Value Observing。您可以在viewController中添加一个观察者来“监视”对模型所做的更改。如果发生这样的更改,则会通知viewController,然后您可以更新视图。

您可以在Apple's documentationmindsizzlers上阅读有关KVO的更多信息,以获得简单易懂的教程。

答案 3 :(得分:1)

界面

@interface CouponSynchronizer : NSObject

+ (CouponSynchronizer *) sharedSynchronizer;

@end

实施

@implementation CouponSynchronizer

static CouponSynchronizer *sharedSynchronizer = nil;

+ (CouponSynchronizer *)sharedSynchronizer
{
    @synchronized(self) {
        if (sharedSynchronizer == nil) {
            sharedSynchronizer = [[self alloc] init];
        }
    }
    return sharedSynchronizer;
}

@end