在Objective c中动态更改全局变量

时间:2016-04-25 13:49:07

标签: ios objective-c macros c-preprocessor

如何设置可在所有类中访问的全局bool变量?它的值可以根据运行时条件进行更改。

3 个答案:

答案 0 :(得分:2)

我绝对不会选择任何建议的解决方案,这些解决方案基于纯ANSI-C解决方案或逻辑错误地推荐使用app-delegate作为全局模型,但我会创建一个模型层上的 singleton 类,它可以在运行时为您存储任何属性。

即使这在技术上不是全局变量 - 它宁愿在任何项目中比在某些随机类中应用全局变量更有意义属于实际的全局变量。

RuntimeEnvironment.h

@interface RuntimeEnvironment : NSObject

+ (instancetype)sharedEnvironment;

@property (nonatomic, getter=isSwitchOn) BOOL switch;

@end

RuntimeEnvironment.m

@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;

这个解决方案很容易维护或扩展,因为你的项目正在增长(它会),并且你也正确地在一个地方,你的模型上正确地封装了所有东西。

答案 1 :(得分:1)

在AppDelegate.h中声明你的bool变量

@property(nonatomic, assign)BOOL *isBOOL;

然后在视图控制器实现文件中创建app delegate共享应用程序对象,并将其指定为viewdidload中的共享应用程序对象。

@interface YourViewController ()
{
   AppDelegate *appdel;
}
- (void)viewDidLoad {
 appdel=(AppDelegate *)[[UIApplication sharedApplication] delegate];
}

现在,您可以通过创建appdelegate共享应用程序对象来访问每个类中的isBOOL变量,还可以根据您的条件更改变量值。

 appdel.isBOOL=YES/NO; 

答案 2 :(得分:1)

虽然@MiteshDobareeya提出的单身方法的属性是一个有用的解决方案并且解决了同样的问题,但它实际上不是全局变量。 / p>

全局变量是每个人都可以访问的顶级变量:

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];
    }
}