在AppDelegate中共享NSMutableDictionary

时间:2014-03-15 09:46:07

标签: ios objective-c appdelegate

我对Objective C很新,所以请耐心等待。我一直在搜索很多线程,但仍然无法找到合适的答案,但我相信这个问题已被反复询问。我发现很多教程如何使用AppDelegate来共享字符串,但我无法弄清楚如何使用它来共享NSMUtableDictionary。

我想在两个类之间共享一个NSMutableDictionary,我将数据添加到一个类中的NSMutableDictionary并将其读取另一个类。我正在使用AppDelegate类来存储数据。

AppDelegate.h

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,retain) NSMutableDictionary *myArray;
@end

AppDelegate.m

#import "TestResults.h"
@synthesize myArray;

TestResults.h

@interface TestResults : UIViewController {
singletonObj * sobj;
}

TestResults.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSMutableDictionary *myArrayFromAppDelegate = appDelegate.myArray;
    [myArrayFromAppDelegate setValue:@"aaa" forKey:@"bbb"];
    NSLog(@"%@", myArrayFromAppDelegate);
}

当我执行NSLog时,它返回一个空数组。我哪里出错了?

4 个答案:

答案 0 :(得分:3)

我认为你忘了在AppDelegate中分配和初始化。 在

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    myArray = [[NSMutableDictionary alloc]init];
    .
    .


    [self.window makeKeyAndVisible];
    return YES;
}

你可以给你的词典命名:myDict它对你有益。

通过从其他ViewController调用此myArray,您将获得空的NSMutableDictionary。

答案 1 :(得分:2)

哦,好老。这确实是一个非常常见的初学者问题。

“如何在应用代理中共享对象”这一问题的真正答案是“”。它会使您的应用程序委托变得混乱,并使其无法完成工作。就像把你家里的食物存放在车里一样。它可以工作,但它会降低汽车的重量,因此在它的主要工作中效果不佳。

您应该将应用程序设计为尽可能少的全局状态。

如果确实需要共享全局状态数据,请不要将其放在应用程序委托中。相反,创建一个数据容器单例并使用它。

你应该能够在[ios]单身人士上进行搜索,并找到许多创建单身人士的例子。数据容器单例只是一个单例,具有用于保存和共享数据的属性。

第二点:

你有一个名为myArray的NSMutableDictionary。这是混乱的一个秘诀。在命名字典时,请勿使用其他类型的名称(错误的类型)。不要这样做! EVER!如果它不是数组,请不要将其称为数组。

第三点:

正如其他人所指出的,你永远不会分配/初始化你的字典。 alloc / init应该发生在拥有字典的对象中(在你的情况下,AppDelegate,但是将它移动到你的数据容器单例中。)你可以在拥有类的init方法中创建它,或者编写一个自定义的getter“懒加载“字典:

- (NSDictionary *)myDict;
{
  if (!_myDict)
  {
    myDict = [NSMutableDictionary new];
  }
  return myDict;
}

答案 2 :(得分:1)

在这里你可以分配这个词典。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   self.myArray = [NSMutableDictionary dictionary];
  .....
}

否则你可以在TestResults.m

中进行
NSMutableDictionary *myArrayFromAppDelegate = appDelegate.myArray;
if (!myArrayFromAppDelegate)
    appDelegate.myArray = [NSMutableDictionary dictionary];

答案 3 :(得分:0)

你也可以做这项工作。

   - (void)viewDidLoad
    {
        [super viewDidLoad];
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        appDelegate.myDictionary=[[NSMutableDictionary alloc]init];////This could be another way
        NSMutableDictionary *myDictionaryFromAppDelegate = appDelegate.myDictionary;///Don't name an dictionary by array!!!!!!!
        [myDictionaryFromAppDelegate setValue:@"aaa" forKey:@"bbb"];
        NSLog(@"%@", myDictionaryFromAppDelegate);
    }

由于