static、const和extern

一、 static 内部全局

作用域:

  • 若在方法外:作用域为整个类,以及该文件中这个类下方的类中。
#import "MyObject.h"

@interface MyObject()
@end
@implementation MyObject
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",stri); /// 会报错,不能访问
    }
    return self;
}
@end

static NSString * stri = @"hello";
@interface MyObject1:NSObject
@end
@implementation MyObject1

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",stri); ///  正常,能访问到
    }
    return self;
}
@end

@interface MyObject2:NSObject
@end
@implementation MyObject2
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",stri); /// 正常,能访问到
    }
    return self;
}
@end
  • 若在方法内:作用域为这个方法。
#import "MyObject.h"

@interface MyObject()
@end
@implementation MyObject
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",stri);/// 会报错,不能访问
    }
    return self;
}
@end

@interface MyObject1:NSObject
@end
@implementation MyObject1

- (instancetype)init
{
    static NSString * stri = @"hello";
    self = [super init];
    if (self) {
        NSLog(@"%@",stri);/// 正常,能访问到
    }
    return self;
}
- (void)test {
    NSLog(@"%@",stri);/// 会报错,不能访问
}
@end

@interface MyObject2:NSObject
@end
@implementation MyObject2
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",stri);/// 会报错,不能访问
    }
    return self;
}
@end

二、 extern 把某文件中的内部变量作用域,扩大至当前所包含作用域

  • 一个文件中的全局变量是不能直接被其他文件访问的,如果想要访问某个文件的全局变量,可以通过extern var 来进行实现

比如有个类为MyObject1 里面定义了一个 name 的变量;

@implementation MyObject1
NSString * name = @"peng";
- (instancetype)init
{
   self = [super init];
   if (self) {
   }
   return self;
}
- (void)test {
}
@end

现在我们想在 MyObject 里面进行访问 MyObject1 中的 name 变量,此时是访问不到的;
但可以通过extern 进行实现访问:

extern NSString * name;
@interface MyObject()
@end
@implementation MyObject
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@",name);
    }
    return self;
}
@end

控制台此时就能通过MyObject打印出 MyObject1 中的name : peng;

也可以把 extern NSString * name;写在MyObject1的.h文件中

三、 const 常量

  • 内存地址唯一、不可修改
  • 需在声明时初始化

你可能感兴趣的:(static、const和extern)