我想知道如何在多个视图控制器之间共享NSDictionary对象,这些视图控制器基本上是我的应用程序中的选项卡。
我尝试使用协议,就像在Java中一样,这样我就可以转换为协议并访问属性。这似乎不起作用。
我也看过类似的问题 How to share data globally among multiple view controllers
但我发现appDelegate方法不安全,可能会导致内存泄漏。
类似地,将A类注入B类会产生同样的问题。
那么有人可以建议我在我的代码中学习或实现的任何方法吗?
答案 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的共享实例的类。
对此进行了详细解释这样,您将以这种方式访问您的共享NSDictionnary :
NSDictionary* sharedDictionnary = [MyModel sharedInstance].sharedDictionary;