所以,我想知道在iOS项目中声明全局变量的正确方法是什么.我不希望它设置为属性,因为不应该从类外部访问该变量.
我将提供一些我见过的方法,让我知道哪种方法是正确的,如果有另一种方式更好.
这样我@interface在实现文件中声明之后在花括号内添加全局变量.m.然后我可以初始化变量viewDidLoad
#import "ViewController.h"
@interface ViewController () {
int globalVariableTest;
}
@end
@implementation ViewController
Run Code Online (Sandbox Code Playgroud)
另一种方法@implementation是在实现文件中声明后在花括号内添加全局变量.m.再次初始化viewDidLoad
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController {
int globalVariableTest;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在@implementation没有花括号后添加变量,这也允许我设置初始值而不使用viewDidLoad
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
int globalVariableTest = 1;
Run Code Online (Sandbox Code Playgroud)
另一种方法是@interface在头文件内部添加变量.h
@interface ViewController : UIViewController
{
int globalVariableTest;
}
Run Code Online (Sandbox Code Playgroud)
所以,如果有更好的方式请告诉我,所有的帮助将不胜感激!
在花括号内声明变量实际上是声明一个实例变量,或者简称为"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
Run Code Online (Sandbox Code Playgroud)
因为它不在.h文件中,所以它不会对其他类"可见"(理论上.请参见上文关于C中可见的所有内容).
另一方面,如果你真正想要的是真正全球化的东西(暗示:你不应该.全局变量通常是设计糟糕的气味),你需要在文件的顶部定义它@interface或@implementation块.
另一个相关的花絮:要定义一个范围仅限于给定文件的"全局"变量,请查看C的static关键字.这真有趣.
| 归档时间: |
|
| 查看次数: |
4355 次 |
| 最近记录: |