目前我在两个不同文件之间进行通信时遇到了一些问题。
这是我的问题: 我有一个文件调用A.h / A.m和另一个文件调用B.h / B.m. A.h需要访问B.h中的一些数据,所以......有什么方法可以实现我想要的东西吗? 只是想知道它是“SharedInstance”能够解决我的问题吗?
寻找回复:))
答案 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 documentation或mindsizzlers上阅读有关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