1

类名 MyData 有 75 个以上的属性,这些属性在 7 个场景中都需要。

目前,我使用以下代码传递 MyData 文件的实例:

在 SceneOne 中:

MyData *myData = [[MyData alloc]init];

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = segue.destinationViewController;
    SceneTwo *sceneTwo = [destinationViewController isKindOfClass:[SceneTwo class]] ? (SceneTwo*)destinationViewController : nil;
    sceneTwo.myData = self.myData;
}

这使我可以访问任何属性myData.anyProperty

当第 7 个场景被关闭时,我设置 myData = NULL,应用程序返回到 SceneOne 并初始化 MyData 的新实例。

我正在尝试通过 sharedInstance 完成上述操作。

我的数据.h

#import <foundation/Foundation.h>

@interface MyData : NSObject {

@property (nonatomic, retain) NSString *someProperty;
// 74 other properties

+ (id)sharedData;

@end

我的数据

#import "MyData.h"

@implementation MyData

@synthesize someProperty;

+ (id)sharedData {
    static Mydata *sharedData = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedData = [[self alloc] init];
    });
    return sharedData;
}

@end

问题 1: 上面的代码是否可以在任何场景中使用下面的代码访问同一个实例:

 MyData *myData = [MyData sharedData];

问题 2: 我仍然可以访问文件myData.anyProperty吗?

问题3: 如何触发MyData的新实例并删除当前实例?

问题 4: 我正在从网络上下载一个 myData 文件,它是 MyData 类的副本,但属性包含数据,我希望 Singelton 提供一个新实例,其中包含下载文件中的数据,那么代码是什么? i.e myData = [newDownloadedFile copy];

问题 5: 使用 Singleton Method Vs. 是否有优势?我现在的方法?

4

1 回答 1

2
  1. 是的
  2. 是的
  3. 你没有。为什么你认为这是必要的?reset您可以改为向 MyData添加一个方法吗?
  4. 您不应该将单例模式与多实例用例混合使用。如果您真的想要一个单例,请考虑在您的数据集中添加一个额外的层。例如,您可能有本地数据远程数据配置。如果这是您想要的,您可能必须更改 MyData 的接口(标题)才能实现这一点。
  5. 单例是跨进程的类的单个实例。当您想从代码中的多个位置访问相同的数据集合时,单例对象是您可以完成此任务的一种方法。否则,您需要实例化一个对象并将其地址传递给所有感兴趣的类,以便它们都访问同一个实例。这是一个过度简化,但我相信它解决了你的问题。

关于您对第 3 条的评论,如果您有一个单例,如果您不再需要在一个地方使用数据,您不想重置整个应用程序的数据。所以考虑一下会产生的影响。如果您不再需要 MyData 对象,请不要再使用它。单例对象通常会在应用程序的生命周期内持续存在,因此释放/处置对象并不常见。

对于数字 4,假设您当前有一个player使用如下方法声明调用的属性:

- (Player *)currentPlayer;

如果您有多个配置可用,您可以向方法接口和实现添加一个参数,如下所示:

- (Player *)currentPlayerForConfiguration:(NSInteger)configuration;

您可以决定使用数字、字符串或其他内容来区分数据的不同配置。如果使用数字,0 可以是本地的,1 可以是远程的,2 可以是任何一个(例如,先检查本地数据,如果不存在,则检查远程)。如果您只有两个选项,则可以使用 aBOOL并像这样定义您的方法:

- (Player *)currentPlayerUsingLocalData:(BOOL)useLocalData;
于 2013-09-29T00:36:07.833 回答