2

我想知道如何在几个视图控制器之间共享一个 NSDictionary 对象,这些视图控制器基本上是我的应用程序中的选项卡。

我尝试使用一个协议,比如在 Java 中,这样我就可以转换为协议并访问该属性。这似乎行不通。

我还查看了 如何在多个视图控制器之间全局共享数据的类似问题

但我观察到 appDelegate 方法并不安全,可能会导致内存泄漏。

同样,将 A 类注入 B 类也会产生同样的问题。

那么任何人都可以建议我在我的代码中学习或实施的任何方法吗?

4

4 回答 4

1

您可以使用单例类来共享数据
检查这个单例类

MyManger.h

#import <foundation/Foundation.h>

@interface MyManager : NSObject {
NSMutableDictionary *_dict
}

@property (nonatomic, retain) NSMutableDictionary *dict;

 + (id)sharedManager;  
@end 

MyManger.m

#import "MyManager.h"

static MyManager *sharedMyManager = nil;

 @implementation MyManager

 @synthesize dict = _dict;

#pragma mark Singleton Methods  

+ (id)sharedManager {
 @synchronized(self) {
    if(sharedMyManager == nil)
      sharedMyManager = [[super allocWithZone:NULL] init];
 }
return sharedMyManager;
} 

- (id)init {
   if (self = [super init]) {
  dict = [[NSMutableDictionary alloc] init];
   }
 return self;
}   

您可以像这样从任何地方访问您的字典

   [MyManager sharedManager].dict
于 2013-03-14T09:43:38.673 回答
1

如果您只想共享字典,为什么不使用辅助类的类方法。

+(NSDictionary *)shareMethod
{
return dict;
} 
于 2013-03-14T09:50:08.677 回答
1

我找到了出路。由于我希望共享字典,因此我在协议中声明了一个方法

- (void) setSingleHouse:(NSDictionary*) singleHouse;

在我的每个控制器中,我以适当的方式实现了该方法。因此,我现在能够与他们分享。

我还发现我之前以错误的方式进行了转换,即(@protocol(协议名称))。现在将其更改为 NSObject 。

抱歉大惊小怪。

于 2013-03-14T10:18:53.163 回答
0

我建议您不要在 appDelegate 实例中使用属性。这种模式不会提高代码的可重用性。

基本上,您共享的 NSDictionnary 是您的模型。因此,如果您希望您的代码遵循 MVC 设计部分,您应该创建一个具有共享实例的类,该实例将在公共属性中包含您的 NDDictionnary。

这在这篇文章中得到了很好的解释

这样,您将通过以下方式访问共享的 NSDictionnary:

NSDictionary* sharedDictionnary = [MyModel sharedInstance].sharedDictionary;
于 2013-03-14T09:51:33.387 回答