2

我只是想通过下面的代码来理解变量的生命。在实例化新实例时,我可以看到 _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 变量之间有什么区别?
4

1 回答 1

5
  1. _inside并且_outside都被声明为全局变量。
  2. _innBraces由于您似乎在同一个文件中声明所有内容,因此和之间没有区别_inmBraces,它们都是类中的实例变量。如果@interface位于头文件中,那么您会看到两者之间的范围有所不同,因为_inmBraces只会在您的实现文件_innBraces中可见,并且在包含该.h文件的任何文件中都可见。
  3. 这些都不是静态的。如果它们曾经是(在static关键字之前),那么它们每个都将是本地的存储和命名空间到声明它们的文件。

在 1 和 3 的情况下,它们都是直接的 C 声明,因此它们是否在@implementationand @interfaceis 的范围内没有任何区别。在 Objective-C 中,没有类变量。

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

static NSString *sMyClassVariable;

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

于 2013-04-02T11:03:56.663 回答