Ios 在目标c中动态更改全局变量
如何设置可在所有类中访问的全局布尔变量?可以根据运行时条件更改其值 在AppDelegate.h中声明bool变量Ios 在目标c中动态更改全局变量,ios,objective-c,macros,c-preprocessor,Ios,Objective C,Macros,C Preprocessor,如何设置可在所有类中访问的全局布尔变量?可以根据运行时条件更改其值 在AppDelegate.h中声明bool变量 @property(nonatomic, assign)BOOL *isBOOL; 然后在视图控制器实现文件中创建应用程序代理共享应用程序对象,并在viewdidload中将其指定为共享应用程序对象 @interface YourViewController () { AppDelegate *appdel; } - (void)viewDidLoad { appdel=
@property(nonatomic, assign)BOOL *isBOOL;
然后在视图控制器实现文件中创建应用程序代理共享应用程序对象,并在viewdidload中将其指定为共享应用程序对象
@interface YourViewController ()
{
AppDelegate *appdel;
}
- (void)viewDidLoad {
appdel=(AppDelegate *)[[UIApplication sharedApplication] delegate];
}
现在,您可以通过创建appdelegate共享应用程序对象来访问每个类中的isBOOL变量,还可以根据您的条件更改变量值
appdel.isBOOL=YES/NO;
在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];
}
}
虽然@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];
}
}
我肯定不会选择任何建议的解决方案,这些解决方案基于纯ANSI-C解决方案,或者逻辑上不正确地建议使用app delegate作为全局模型,但我会在模型层上创建一个singleton类,它可以在运行时为您存储任何属性 即使这在技术上不是一个全局变量,但它在任何项目中都更有意义,而不是在某个不属于实际全局变量的随机类中应用纯全局变量
RuntimeEnvironment.h RuntimeEnvironment.m
在行动中: 设置变量:
[RuntimeEnvironment sharedEnvironment].switch = TRUE;
或读取其当前值:
BOOL _myGlobalSwitch = [RuntimeEnvironment sharedEnvironment].isSwitchOn;
随着项目的发展,此解决方案很容易维护或扩展(它会),而且您也在模型的某个位置对所有内容进行正确的封装。我肯定不会选择任何建议的解决方案,它基于纯ANSI-C解决方案,或者逻辑上不正确地建议使用app delegate作为全局模型,但我会在模型层上创建一个singleton类,它可以在运行时为您存储任何属性 即使这在技术上不是一个全局变量,但它在任何项目中都更有意义,而不是在某个不属于实际全局变量的随机类中应用纯全局变量
RuntimeEnvironment.h RuntimeEnvironment.m
在行动中: 设置变量:
[RuntimeEnvironment sharedEnvironment].switch = TRUE;
或读取其当前值:
BOOL _myGlobalSwitch = [RuntimeEnvironment sharedEnvironment].isSwitchOn;
随着项目的发展,此解决方案很容易维护或扩展(它会),而且您也可以在模型的某个位置正确地对所有内容进行封装。您遇到了相互冲突的需求。顾名思义,常量不能在运行时更改。您可能需要一个具有默认值的全局变量,尽管很难说您实际上想要实现什么。也许功能会更好。因此,请编辑您的问题并澄清您试图解决的问题(此值用于什么/您希望如何使用它)。请编辑您的问题并显示您已经拥有的内容,以使其更清楚。您有相互冲突的要求。顾名思义,常量不能在运行时更改。您可能需要一个具有默认值的全局变量,尽管很难说您实际上想要实现什么。也许功能会更好。因此,请编辑您的问题并澄清您试图解决的问题(此值用于什么/您希望如何使用它)。请编辑您的问题并显示您已经拥有的内容,以使其更清楚。不要到处创建实例变量,最好在
AppDelegate
类上创建一个单例getter,如下所示:+(AppDelegate*)sharedapdelegate{return(AppDelegate*)[[UIApplication sharedApplication]delegate]}
然后您只需执行[[AppDelegate sharedAppDelegate]isBOOL]
即可。AppDelegate仅用于与整个应用程序的运行相关的操作。不要用它来存放任何你想要的旧东西。除非这是关于整个应用程序的,否则请将其放入适当的文件中。我不会将应用程序委托用作全局模型–这根本不是应用程序委托的目的。您也可以在prefixheader文件中定义它。与其到处创建实例变量,最好在AppDelegate
类上创建一个单例getter,如下所示:+(AppDelegate*)sharedapdelegate{return(AppDelegate*)[[UIApplication sharedApplication]delegate]}
然后您只需执行[[AppDelegate sharedAppDelegate]isBOOL]
即可。AppDelegate仅用于与整个应用程序的运行相关的操作。不要用它来存放任何你想要的旧东西。除非这是关于整个应用程序的,否则请将其放入适当的文件中。我不会将应用程序委托用作全局模型–这根本不是应用程序委托的目的。您也可以在prefixheader文件中定义它。此全局变量“globalBool”在整个应用程序中是否只有一个实例?如果我在一个类中编辑它,它也会反映在其他类中吗?你需要在每个文件中全局重构它。@Jeyanthu:是的,它只是整个应用程序中的一个实例。在一个地方操作它也会在任何其他地方“更新”,因为他们正在访问相同的东西。@holex:你说“你需要在eac中全局重构它”是什么意思