一. const与define的区别
1)执行时刻:宏是预编译(编译之前处理),const是编译阶段。
2)编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
3)宏可以定义一些函数,方法。 const不能。
(这里需要证实一点,宏不会开辟新的内存空间 ,而是存放在常量区,也就是正常使用并不会造成内存暴涨 ).
推荐使用const,而不是define。
二. const使用
全局常量:一处定义常量,全局可以使用。
例如:在ViewController.m中定义一个全局常量:
const NSString *cc = @"cc123";
在AppDelegate.m中可以访问:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
extern NSString *cc;
NSLog(@"%@",cc);
return YES;
}
终端显示:
const.png
三. extern 使用
在上面我们就看到了,如果你要访问别的文件中定义的全局常量,就需要用到extern关键词了。
四. static使用
4.1 基础
static修饰的变量叫做 静态变量 。它被储存在全局区(或者叫静态区) ,该区域的变量在编译时即被分配内存,并且在app运行期间一直存在内存当中,直到app停止运行。所以被static修饰的变量在内存中只存有一份,并且在整个app运行期只被初始化一次。它的生命周期与应用程序是一样的。
从面向对象的角度出发,当需要一个数据对象为整类而非某个对象服务,同时又要求此变量隐藏在类的内部的时候,就可以使用static。
4.2 优点:
1)节省内存,静态变量只存储一处(全局区,也叫静态区),但供所有对象使用。
2)它的值是可以更新的(声明后的static变量在其他类中是不能通过类名直接访问的,但是可以通过这个对象的方法间接修改这个静态变量的值)。
3)可提高时间效率,只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。
4.3 作用
1)隐藏性:只能在本类的.m文件中使用,它的作用域只是在声明的这个.m文件中 。声明后的static静态变量在其他类中是不能通过类名直接访问的,但是可以通过调用这个类的方法间接修改这个静态变量的值(单例模式)。
2)持久性:static标记的变量会存储到全局区(静态区),生命周期和程序相同。只在声明的类中可见,在声明的类中结束后,再次使用还是之前的值。
4.4 总结
局部变量和局部静态变量的区别在于它的生命周期。全局变量和全局静态变量的区别在于作用域。变量和静态变量的不同之处在于后者的内存只被分配一次。
开发使用场景:在一个文件中经常使用的只读字符串常量,可以使用static与const组合。
需要注意的是: 静态变量需要酌情使用,滥用会导致占用过多内存。
附:无论是.h或.m文件中,static 写在interface外面编译是没有错误的,但写在interface里面会直接报错。
//example.m
#import "example.h"
static int count = 10;
@implementation Example
+(int)count{
return count;
}
@end
上面的例子中可以通过[Example count]对静态变量count进行访问,无须创建实例。
网友评论