视图控制器之间的对象共享

时间:2013-03-14 09:39:16

标签: ios objective-c

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

我尝试使用协议,就像在Java中一样,这样我就可以转换为协议并访问属性。这似乎不起作用。

我也看过类似的问题 How to share data globally among multiple view controllers

但我发现appDelegate方法不安全,可能会导致内存泄漏。

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

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

4 个答案:

答案 0 :(得分:1)

您可以使用单例类来共享数据 请检查此Singleton class

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

答案 1 :(得分:1)

如果您只想分享词典,为什么不使用辅助类来使用类方法。

+(NSDictionary *)shareMethod
{
return dict;
} 

答案 2 :(得分:1)

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

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

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

我还发现我之前以错误的方式进行投射,即(@protocol(协议名称))。现在把它改成NSObject。

抱歉大惊小怪。

答案 3 :(得分:0)

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

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

this post

对此进行了详细解释

这样,您将以这种方式访问​​您的共享NSDictionnary :

NSDictionary* sharedDictionnary = [MyModel sharedInstance].sharedDictionary;