[英]Dynamically changing global variables in Objective c
如何设置可以在所有类中访问的全局布尔变量? 可以根据运行时条件更改其值。
我绝对不会选择任何建议的解决方案,这些解决方案基于纯ANSI-C解决方案,或者在逻辑上不正确地建议将app-delegate用作全局模型,但是我会在您的模型层上创建单例类,这样可以在运行时为您存储任何属性。
即使从技术上讲不是全局变量 –在任何项目中,它比在某些不真正属于实际全局变量的随机类中应用纯全局变量更有意义。
@interface RuntimeEnvironment : NSObject
+ (instancetype)sharedEnvironment;
@property (nonatomic, getter=isSwitchOn) BOOL switch;
@end
@implementation RuntimeEnvironment
+ (instancetype)sharedEnvironment {
static id _sharedInstance = nil;
@synchronized([self class]) {
if (_sharedInstance == nil) {
_sharedInstance = [[[self class] alloc] init];
}
}
return _sharedInstance;
}
@end
设置变量:
[RuntimeEnvironment sharedEnvironment].switch = TRUE;
或读取其当前值:
BOOL _myGlobalSwitch = [RuntimeEnvironment sharedEnvironment].isSwitchOn;
此解决方案易于(随着项目的增长)易于维护或扩展,并且您还在模型上的某个位置正确地对所有内容进行了正确的封装。
在AppDelegate.h中声明您的bool变量
@property(nonatomic, assign)BOOL *isBOOL;
然后在视图控制器实现文件中创建应用程序委托共享应用程序对象,并将其分配为viewdidload中的共享应用程序对象。
@interface YourViewController ()
{
AppDelegate *appdel;
}
- (void)viewDidLoad {
appdel=(AppDelegate *)[[UIApplication sharedApplication] delegate];
}
现在,您可以通过创建appdelegate共享应用程序对象来访问每个类中的isBOOL变量,还可以根据您的条件更改变量值。
appdel.isBOOL=YES/NO;
虽然@MiteshDobareeya提出的单例方法的属性是一个有用的解决方案,并且可以解决相同的问题,但实际上它不是全局变量 。
全局变量是每个人都可以访问的顶级变量:
Foo.h:
extern SomeType globalVariableName;
// For example:
extern NSString * globalString;
extern BOOL globalBool;
Foo.m
// This is at the top-level, outside any @implementation !
// You need this once in your app to actually define the
// variables values.
SomeType globalVariableName = initialValue;
NSString * globalString = @"Zoobar";
BOOL globalBool = YES;
SomeOther.m
#import "Foo.h"
- (void)foo {
// You can access the variable in any Objective-C method
// or even C function.
if (globalBool) {
[self doSomething];
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.