我对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时,它返回一个空数组。我哪里出错了?
答案 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);
}
由于