所以,我想知道在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;
}
所以,如果有更好的方式请告诉我,所有的帮助将不胜感激!
答案 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 = ...