const/static/extern/self/super

一 .const 和 宏 的区别

const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量。

  • 编译时刻:宏是预编译(编译之前处理),const是编译阶段。
  • 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
  • 宏的好处:宏能定义一些函数,方法。 const不能。
  • 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。

注意: 有很多博客(Blog)描述宏时,说使用宏会消耗很多内存,这种说法并不正确.它并不会生成很多内存.因为宏定义的是常量,常量都存放在常量区,只会产生一份内存.

// 常见的常量:抽成宏
#define XMGAccount @"account"
#define XMGUserDefault [NSUserDefaults standardUserDefaults]

// 字符串常量
static NSString * const account = @"account";

- (void)viewDidLoad {
[super viewDidLoad];

// 偏好设置存储
// 使用宏
[XMGUserDefault setValue:@"123" forKey:XMGAccount];

// 使用const常量
[[NSUserDefaults standardUserDefaults] setValue:@"123" forKey:account];
}

const作用:限制类型

  • 注意点:
  • 1.const仅仅只能用来修饰右边的变量(只能修饰变量:基本变量,指针变量,对象变量);
  • 2.const修饰的变量表示只读;
  • 3.const的书写规范:只能放在变量名的左边;

int *const p = &a;          p:只读变量;*p:变量;
const int *p = &a;          p:变量;*p:只读变量;
int const *p = &a;          p:变量;*p:只读变量;
- int const * const p = &a;  p:只读变量;*p:只读变量;
- const int * const p = &a;  p:只读变量;*p:只读变量;

const的使用场景:

@implementation ViewController

// 定义只读全局常量
NSString * const str  = @"123";

// 当一个方法的参数,只读.
- (void)test:(NSString * const)name
{

}

// 指针只读,不能通过指针修改值
- (void)test1:(int const *)a{

//    *a = 10;
}

// 基本数据类型只读
- (void)test2:(int const)a{

}
@end

二 .static 和 extern

static 的作用:

1.修饰局部变量
    * 延长这个局部变量的生命周期;
    * 局部变量只会分配一次内存;为什么?用static修饰的代码,只会再程序一启动就会执行,以后就不会在执行;
2.修饰全局变量
    * 只会修改全局变量的作用域,表示只能再当前文件中使用,工程的中其他文件都不能使用.

extern 的作用:
1.声明一个全局变量,不能定义变量
注意:extern修饰的变量不能初始化;它仅仅用于修饰一个全局变量.

2.使用场景:仅仅用于再其他文件中声明一个全局的变量.

extern工作原理:
如过在某个文件中用extern声明了一个全局变量,那么系统就会先在当前文件查找有没有已经定义的同名全局变量,如果没有找到,才会去其他文件查找。

// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;

// static修饰全局变量
static int age = 20;

- (void)test
{
    // static修饰局部变量
    static int age = 0;
    age++;
    NSLog(@"%d",age);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self test];
    [self test];

    extern int age;
    NSLog(@"%d",age);
}

三 .static 和 const的联合使用

  • 1.全局变量一般都是只读的,不允许其他人修改,所以会加const修饰,而如果还要求不允许在项目的其他文件中使用的话,再在前面加一个static修饰.
  • 2.开发中常用static修饰全局变量,只改变作用域 ,为什么要改变全局变量作用域?

    答:防止重复声明全局变量。

  • 3.开发中声明的全局变量,有些不希望外界改动,只允许读取。比如一个基本数据类型不希望别人改动
  • 4.声明一个静态的全局只读常量

    static const int a = 20;

  • 5.staic和const联合的作用:声明一个静态的全局只读常量
  • 6.iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
  • 7.开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。 static NSString * const key = @"name";
  • 8.如果 const修饰 key1,表示key1只读,key1还是能改变。

    static NSString const *key1 = @"name";

    四 .extern 和 const的联合使用

  • 开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用exterm与const组合
  • 原因:
    • static与const组合:在每个文件中都需要定义一份静态全局变量;
    • extern与const组合:只需要定义一份全局变量,多个文件共享;
  • 具体用法: 全局常量正规写法 : 开发中便于管理所有的全局变量,通常搞一个GlobeConst文件,里面专门定义全局变量,统一管理,要不然项目文件多,不好找.

/****************************首页*************************/

extern NSString * const nameKey = @"name";

/****************************首页*************************/ GlobeConst.m

#import

/****************************首页*************************/

NSString * const nameKey = @"name";

/****************************首页*************************/


五 .super / superClass / Class

[self class];           获取方法调用者的类名
[self superClass];     获取方法调用者父类的类名
[super class];          用当前类对象(注意这里super不是父类的类对象,它只是一个)

// class:获取方法调用类名
// superclass:获取方法调用者的父类类名
// super:编译修饰符,不是指针,指向父类标志,

//** 注意:super并不是拿到父类对象去调用父类方法,suoer的本质还是拿到当前对象去调用父类的方法 **//
时间: 2024-10-12 12:14:22

const/static/extern/self/super的相关文章

iOS之const,static,extern简介

const,static,extern简介 一.const与宏的区别: • const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. ? 编译时刻:宏是预编译(编译之前处理),const是编译阶段. ? 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误. ? 宏的好处:宏能定义一些函数,方法. const不能. ? 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换. • 注意:很多Blog都说使用宏,

iOS 中 const static extern 关键字总结

在看一些高手所写的代码时,总是可以看到我们小白平常不用的关键字,一次,两次,三次,不能总是不明不白,现在总结一下日常开发中常用的关键字的作用: 关键字const/static/extern的释义和用法 1. const 这个单词翻译成中文就是 "常量"的意思.在程序中我们知道常量的值是不能变的,固定的.所以const关键字的作用就是: (1) const用来修饰右边的基本变量或指针变量 (2)被修饰的变量只读,不能被修改 下面举一个简单的例子: //声明一个int类型的变量a 初始化值

const&static&extern

const 结论: 如果const写在指针变量名的旁边, 那么指针的指向不能变, 而指向的内存空间的值可以变 如果const写在数据类型的左边或者右边, 那么指针的指向可以改变, 但是指向的内存空间的值不能改变 // 字符串常量,修饰account,既:account这个是常量不能改,但是他所指向的值 @"这个是可以改的",而且文档字符串常量都是这样的,颜色和宏的颜色也不一样. static NSString * const account = @"account"

03 - const static extern

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const可以在一定程度上提高程序的安全性和可靠性,再者在看别人的代码作品的时候也可以有助于清晰理解const所起的作用. 1.const和#define的区别 (1)编译器处理的方式不相同 define定义的宏是在预处理阶段展开的,而const定义的常量则是在编译阶段使用的 (2)类型和安全检查不同 define宏没有类型,并且不做任何的类型检查,仅仅是展开 const常量具有具体的类型,在编译阶段会执行类型检查 (3)存储方式不

const ;static;extern的使用与作用

 const                                                                /**      const :常量      const  与宏的区别      1.编译时刻 : const: 编译时刻 ,  宏:预编译      2.编译检查: const  会检查错误 , 宏: 不会检查错误      3.宏的好处: 可以定义代码      4.宏的坏处: 编译时间过长, 因此常用的字符串通常使用 const修饰      注意:

const static extern inline volatile explicit

static关键字至少有下列n个作用: (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问: (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内: (4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝: (5)在类中的static成员函数属于整个

static extern const修饰符

const const修饰的东西不能被修改(由左至右解读-->顺时针螺旋法则) 指针类型根据位置的不同可以理解成3种情况: 1.常量指针 NSString * const pt1; //常量指针,指向一个字符串 //pt1初始化之后不能赋值,指向的对象值可以修改. //定义字符串常量 //NSString* const [email protected]"123"; @"123"存储在文字常量区,相同的字符串只存储一份 NSString* [email pro

objectiveC【语法】修饰符 static extern const

转自http://blog.csdn.net/xpwang168/article/details/8087143 const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变. NSString * const pt1; II 指向常量的指针 // 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改 const NSString * pt2; III 指向常量的

static extern const

static 1.局部变量 // 该变量生命周期不仅仅是进入该函数后,而是整个程序运行期间 void foo() { static int nVar = 0; printf("var = %d\n", ++nVar); } 2.保护本地变量 static int g_nVar; // g_nVar只能在本文件中使用,其他文件不能通过extern访问该变量 3.静态成员变量 // 该变量不属于对象,而属于这个类 class Foo { public: static int nCount;