码迷,mamicode.com
首页 > 其他好文 > 详细

const/static/extern/self/super

时间:2015-10-23 21:23:37      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

一 .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的本质还是拿到当前对象去调用父类的方法 **//

const/static/extern/self/super

标签:

原文地址:http://www.cnblogs.com/wangjianjune/p/4905652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!