在@implementation内部和外部声明变量

时间:2013-04-02 10:52:20

标签: objective-c

我只是试图通过丢弃代码来理解变量的生命。我可以看到_inside和_outside在实例化新实例时保留,而大括号则不然。

@interface ViewController (){
    NSString *_innBraces;
}

@end

NSString *_outside;

@implementation ViewController{
    NSString *_inmBraces;
}

NSString *_inside;

-(id)initWithInside:(NSString*)inside outside:(NSString*)outside nBraces:(NSString*)nBraces mBraces:(NSString*)mBraces{
    self = [super init];
    if (self) {
        _inside = inside;
        _outside = outside;
        _innBraces = nBraces;
        _inmBraces = mBraces;
        return self;
    }else{
        return nil;
    }
}
  1. _inside和_outside的声明地点之间有什么区别吗?
  2. 声明变量的大括号变量之间的差异是什么?
  3. 静态变量与_inside / _outside变量声明相同的方式之间有什么区别吗?

1 个答案:

答案 0 :(得分:5)

  1. _inside_outside都被声明为全局变量。
  2. 由于您似乎在同一个文件中声明了所有内容,因此_innBraces_inmBraces之间没有区别,它们都是类中的实例变量。如果@interface位于标头文件中,那么您会看到两者之间的范围不同,因为_inmBraces只会在您的实施文件中显示,并且_innBraces将是在包含.h文件的任何文件中都可见。
  3. 这些都不是静态的。如果它们(在static关键字之前),那么它们将在存储和命名空间中都是本地的,并且声明它们的文件。
  4. 在1和3的情况下,它们都是直接C声明,因此它们是否在@implementation@interface的范围内并没有任何区别。在Objective-C中,没有类变量。

    对于类变量,一般过程是创建以下形式的文件静态变量:

    static NSString *sMyClassVariable;
    

    在实现文件中。此变量因为是静态的,在您的实现文件之外的任何其他文件中都不可见。