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

Sar*_*ran 2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. _inside和_outside的声明地点之间有什么区别吗?
  2. 大括号变量与声明位置之间有什么区别?
  3. 声明与_inside/_outside变量相同的静态变量之间的任何区别?

gai*_*ige 5

  1. _inside并且_outside都被声明为全局变量.
  2. 既然你出现在同一个文件中声明的一切,有没有什么区别_innBraces_inmBraces,他们在这两个类的实例变量.如果@interface它们在头文件中,那么您会看到两者之间的范围不同,因为它_inmBraces只会在您的实现文件_innBraces中可见,并且将在包含该.h文件的任何文件中可见.
  3. 这些都不是静态的.如果它们(在static关键字之前),那么它们将在存储和命名空间中都是本地文件到它们被声明的文件.

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

对于类变量,一般过程是创建表单的文件静态变量:

static NSString *sMyClassVariable;
Run Code Online (Sandbox Code Playgroud)

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