不了解全局variables
我正在开发一个iPad应用程序,经常需要共享variables。 对我来说,似乎最简单的解决scheme是创build一个全局variables的类,而不是关注来回传递 – 因为我也遇到了一些问题。
使用Xcode 5与故事板,在Objective-C中为iPad IOS7创build和使用全局variables的最简单方法是什么?
(我知道有重复,但我不能让它工作)
编辑:以下@nhgrif和其他评论,我稍微改变我的答案
传递variables或使用全局variables的方式实际上取决于你想要做什么。
这里有几个方法:
将值从一个视图传递到另一个视图可以简单地在添加到堆栈之前完成,如下所示:
ViewController *viewController = [[ViewController alloc] init]; viewController.yourIntegerValue = 42; [self presentViewController:viewController animated:YES completion:nil];
NSUserDefaults非常适用于通用的小数据块,您可以将它们传递或保存供以后使用。 看到从AlwaysWannaLearn的例子,我通常build立和存储NSDictionary所有的通用值(与键)。 (另见@nhgrif的评论,我同意)
AppDelegate解决scheme是@Martin Kolesbuild议的另一种方式。 也许可以为单一的价值观,如果只是为了让我所有的全局在一个地方,我会避免它。
单身解决scheme(原始答案)。 它简单,可扩展,优雅和高效。 我通常将其中的一个添加到我创build的任何项目中。
这里是如何快速做到这一点:
创build一个新文件:MyManager.h
#import <foundation/Foundation.h> @interface MyManager : NSObject { NSString *someProperty; } @property (nonatomic, retain) NSString *someProperty; + (id)sharedManager; @end
创build一个新的文件:MyManager.m
#import "MyManager.h" @implementation MyManager @synthesize someProperty; #pragma mark Singleton Methods + (id)sharedManager { static MyManager *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; } - (id)init { if (self = [super init]) { someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; } return self; } - (void)dealloc { // Should never be called, but just here for clarity really. } @end
那真的是 –这个class级将会持有你的全球职能和价值观
要使用这个漂亮的技巧,请将以下行粘贴到项目的其他任何位置
MyManager *sharedManager = [MyManager sharedManager]; //int getValuefromSingleton = sharedManager.MyFunctionOrValue;
实现和使用Singleton模式的最简单和最简单的方法:
创build一个NSObjectinheritance类,你的头文件(.h)应该是这样的:
@interface MySingletonClass : NSObject //this method will be used to get singleton instance + (MySingletonClass *)sharedInstance; //some variables getters and setters - (void)setName:(NSString *)name; - (NSString *)name; - (void)setAge:(int)age; - (int)age; @end
这将是你的实现(.m)类:
@interface MySingletonClass() { } //your global variables @property (nonatomic, strong) NSString *name; @property (nonatomic) int age; @end @implementation MySingletonClass static MySingletonClass *sharedInstance = nil; //this method will be used to get singleton instance + (MySingletonClass *)sharedInstance { if(sharedInstance == nil){ sharedInstance = [[MySingletonClass alloc] init]; } return sharedInstance; } -(id)init { if(self = [super init]) { _name = @""; _age = 0; } return self; } //some variables getters and setters - (void)setName:(NSString *)name { _name = name; } - (NSString *)name { return name; } - (void)setAge:(int)age { _age = age; } - (int)age { return age; } @end
你也可以在头文件中定义你的variables。
您可以在整个应用程序中使用set / getvariables,如下所示:
[[MySingletonClass sharedInstance] setName:@"Test"]; NSString *name = [[MySingletonClass sharedInstance] name];
而是使用全局variables,你应该使用存储键值对的NSUserDefaults
或者Keychain
,你可以在任何地方和应用程序的任何控制器中使用它们。 全局variables通常不是首选,因为安全性较低。 他们的价值可以很容易地改变。 与全局variables相比, Keychain
和NSUserDefaults
更安全,您可以将多个值存储在一个地方。 使用NSUserDefaults
的示例如下所示,其中value存储在其中并在应用程序中的任何位置使用。
用于存储键值对:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:[finalDetails valueForKey:@"Std_Id"] forKey:@"Std_Id"];
用于在其他控制器中获取该值。
NSString *stdId = [[NSUserDefaults standardUserDefaults] valueForKey:@"Std_Id"];
我尝试只使用NSUserDefaults
来获取相对简单的值,这些值需要在应用程序的执行之间持续存在 – 对于更复杂的数据,Core Data可能更合适。
对于瞬态数据,我更喜欢使用数据模型类。
数据模型类将具有所需的属性,有时还有一些类或实例方法来操作数据。 一旦在模型类中获得了数据,通常在视图控制器之间传递引用非常简单,并避免使用“全局variables”。 如果你真的需要'全局',那么你可以使用单例模式 – 例如,[UIApplication sharedApplication]是一个单例。
您可以使用以下结构创build一个单例
MyData.h
@interface MyData : NSObject { NSString *someProperty; } @property (nonatomic, retain) NSString *someProperty; + (id)sharedMyData @end
MyData.m
#import "MyData.h" @implementation MyData #pragma mark Singleton Methods + (id)sharedMyData { static MyData *sharedMyData = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyData = [[self alloc] init]; }); return sharedMyData; } - (id)init { if (self = [super init]) { someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; } return self; }
然后,无论您需要访问您的数据,您都可以使用[MyData sharedMyData];
获得对其的引用[MyData sharedMyData];
有一个不保存状态的全局variables的最简单的方法是在AppDelegate上有一个属性(在你的应用中是一个Singleton):
在AppDelegate.h文件中:
@property (strong, nonatomic) NSString *globalString;
到处都需要访问:
#import "AppDelegate.h" AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; // use appDelegate.globalString ...
如果您需要在您的课堂中多次使用AppDelegate,则将其定义为属性并懒洋洋地启动:
@property (nonatomic, strong) AppDelegate *appDelegate; - (AppDelegate *)appDelegate { if (!_appDelegate) { _appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; } return _appDelegate; }
但是,您应该总是尽量避免这种情况,因为它违反了OOP规则。 我build议你阅读iOSdevise模式,尤其是MVC,Facade和Singleton: iOSdevise模式
Singleton NSUserDefaults
也可以使用,但是这是为了保存状态,因为它终止应用程序。