在Objective-C中声明全局变量的正确方法是什么

时间:2014-08-12 13:22:13

标签: objective-c

所以,我想知道在iOS项目中声明全局变量的正确方法是什么。 我不希望将它设置为属性,因为不应该从类外部访问该变量。

我将提供一些我见过的方法,让我知道哪种方法是正确的,如果还有其他更好的方式。

这样我在实现文件@interface中的.m声明之后在花括号内添加全局变量。然后我可以在viewDidLoad

中初始化变量
#import "ViewController.h"

@interface ViewController () {
    int globalVariableTest;
}
@end

@implementation ViewController

另一种方法是在实现文件@implementation中的.m声明之后在花括号内添加全局变量。再次初始化viewDidLoad

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController {
       int globalVariableTest;
}

另一种方法是在没有花括号的@implementation之后添加变量,这也允许我在没有viewDidLoad

的情况下设置初始值
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

int globalVariableTest = 1;

另一种方法是在头文件@interface.h之后添加变量

@interface ViewController : UIViewController
{
    int globalVariableTest;
}

所以,如果有更好的方式请告诉我,所有的帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

在花括号内声明变量实际上是声明实例变量或“ivar”。也就是说,一个对你的类的实例本地的变量。

以前只能在@interface声明之后才能这样做,这就是你有时会在那里看到它的原因。这在Xcode 4周围发生了变化,现在您也可以在@implementation之后进行更改。据我所知,这只是风格偏好。 ivars永远不会在课堂外访问(理论上。从技术上讲,C中的所有内容都可以访问),因此在.h中定义它们不会使它们公开。但它确实暴露了一个实现细节,这就是为什么我现在看到的大多数使用它们的代码都将它们放在@implementation中。

但我不再在代码中看到它们了。因为当你定义一个@property实际上发生的事情是一个ivar,一个getter方法和一个setter方法都正在为你合成。 getter和setter方法只获取ivar的值并分别设置ivar的值。

因此,如果你想要的是与属性具有相同范围的东西,但没有-myVar-setMyVar:方法,那么这是正确的方法。

但你可能不应该那样想。有很多原因,只能通过访问器方法访问ivars。它允许您覆盖功能,翻译值以及抽象为您提供的所有其他有趣的事物。

如果您想要的是在课堂外无法访问的@property,只需在类扩展中声明它:

//In MyClass.m
@interface MyClass()
  @property NSNumber *myProperty;
@end

@implementation MyClass
  //All your implementation stuff here.
@end

因为它不在.h文件中,所以它不会对其他类“可见”(理论上。见上文关于C中可见的所有内容)。

如果另一方面,你真正想要的是真正全球化的东西(暗示:你不应该。全局变量通常是设计糟糕的气味),你需要在你的顶部定义它在任何@interface@implementation块之外的文件。

另一个相关的花絮:要定义范围仅限于给定文件的“全局”变量,请查看C的static关键字。这很有趣。

答案 1 :(得分:0)

您可以使用单例类在不同类(视图控制器)之间创建/共享(读/写)所有变量。

·H

@interface SharedVariables : NSObject  {
    NSDictionary *dicti_StackSites;
    NSDictionary *dicti_UserMe;
}

@property(nonatomic, strong) NSDictionary *dicti_StackSites;
@property(nonatomic, strong) NSDictionary *dicti_UserMe;

+(id)sharedVariablesManager;

@end

SharedVariables.m

#import "SharedVariables.h"

@implementation SharedVariables
@synthesize dicti_StackSites;
@synthesize dicti_UserMe;

+(id)sharedVariablesManager {
    static SharedVariables *sharedVariablesClass = nil;
    @synchronized(self) {
        if (sharedVariablesClass == nil) {
            sharedVariablesClass = [[self alloc] init];
        }
    }
    return sharedVariablesClass;
}

-(id)init {
    if (self = [super init]) {
        dicti_StackSites = [[NSDictionary alloc] init];
        dicti_UserMe = [[NSDictionary alloc] init];
    }
    return self;
}

-(void)dealloc {
}

@end

来自任何其他类的用法

#import "SharedVariables.h"

SharedVariables *sharedManager = [SharedVariables sharedVariablesManager];

//to get sharedManager.dicti_StackSites
//to set sharedManager.dicti_StackSites = ...