如何正确使用全局变量?

时间:2013-07-01 14:51:56

标签: objective-c global-variables

我是Objective-C的初学者,我正在尝试使用全局变量。我知道这个问题已被问了一百次,但没有一个答案对我有用。 我正在尝试在一个类中声明一个BOOL变量,并在另一个类中检查它的值。这就是我正在使用的: SController.h:

@interface SController : UIViewController {
    BOOL leftSide;
    BOOL rightSide;

}

SController.m:

- (void)viewDidLoad {
 leftSide = YES;
 rightSide = YES;
}

现在,对于我正在尝试访问BOOL的值的类:

#import "SController.h"
@interface VViewController : UIViewController
{
}

和VViewController的.m:

- (void)viewDidLoad {
// See what the BOOL values from SController are.
}

我尝试了什么: 在这里讨论以前的相关问题,我已经尝试将“extern”放在SController.h中的BOOLs声明前面,但这没有用。我尝试将SControllers头文件导入VViewController,但这也无效。我对Objective-C和编程非常陌生,所以我很难绕过这样的基本概念。我理解使用全局变量的潜在问题,但这个程序非常小并且供个人使用。如果有人能告诉我要改变什么来实现这一目标,那就太棒了。

4 个答案:

答案 0 :(得分:1)

与其他人所说的一样,不要为此(以及其他大多数)目的使用全局变量。

您创建了iVars并且为了访问它们,您需要将它们暴露给其他对象。 您通常通过在SController s头文件中定义@properties来实现此目的。这样做时,您不需要自己创建iVar,它们是隐式创建的。并且自动创建访问iVars的方法(getter和setter)。

您的SControllers标头看起来像这样:

@interface SController: UIViewController
//no need to declare the iVars here, they are created by the @property definitions

@property (nonatomic, assign) BOOL leftSide;
@property (nonatomic, assign) BOOL rightSide;

@end

在你的另一个viewController中,你需要一个你之前创建的SController实例的引用,并且想要“讨论”(你理解这一点很重要),然后你可以通过生成的getter / setter方法访问实例变量这样:

//this is "dot notation", the first line would be equivalent
//to writing: [sControllerInstance setLeftSide: YES]
sControllerInstance.leftSide = YES;
BOOL valueRightSide = sControllerInstance.rightSide;

请阅读:objective-c属性,getter / setter和点符号。 你会在google和SO上找到大量的信息

答案 1 :(得分:0)

我知道这不是您正在寻找的答案,但请尝试重新考虑您的应用。全局变量不是面向对象编程的最佳方式。

答案 2 :(得分:0)

创建GlobalVariable.h头类文件,并按如下方式定义以下外部文件

extern NSString * googleURL;

然后在你的实现GlobalVariable.m文件

#import "GlobalVariable.h"

NSString * googleURL = @"www.google.co.uk";

然后将该类导入到您想要使用它的任何位置。

答案 3 :(得分:0)

默认情况下,变量(在代码中定义)受到保护。您可以在2个变量之前添加@public关键字以使其公开,但不建议这样做。通常,您希望使用@property关键字

将这些属性公开为属性

示例:

@interface SController : UIViewController {

    @public
    BOOL leftSide;
    BOOL rightSide;

    @protected
    //other protected variables here
}