美文网首页iOS 技术点iOS开发常用知识点iOS面试汇总
iOS定义静态变量、静态常量、全局变量

iOS定义静态变量、静态常量、全局变量

作者: JerryLMJ | 来源:发表于2016-04-06 14:53 被阅读20787次

静态变量

当我们希望一个变量的作用域不仅仅是作用域某个类的某个对象,而是作用域整个类的时候,这时候就可以使用静态变量。

static
static修饰的变量,是一个私有的全局变量。
C或者Javastatic关键字修饰的变量,可以使用类名直接拿到这个变量对象,在其他类中可以进行修改。但是在OCstatic修饰的变量是不能通过类名直接访问的,它只作用于它声明所在的.m文件中。
static修饰的变量必须放在@implementation外面或方法中,它只在程序启动初始化一次。

static int num;

静态常量

const
const修饰的变量是不可变的,如果需要定义一个时间间隔的静态常量,就可以使用const修饰。

static const NSTimeInterval LMJTimeDuration = 0.5;

如果试图修改TimeDuration编译器则会报错。

如果我们定义一个字符串类型的静态常量就要注意了,这两种写法是一样的,而且是可以修改的

static NSString const * LMJName = @"iOS开发者公会";
static const NSString * LMJName = @"iOS开发者公会";

这两种写法cons修饰的是* LMJName,*是指针指向符,也就是说此时指向内存地址是不可变的,而内存保存的内容时可变的。
所以我们应该这样写:

static NSString * const LMJName = @"iOS开发者公会";

当我们定义一个对象类型常量的时候,要将const修饰符放到*指针指向符后面。

全局变量

extern
extern修饰的变量,是一个全局变量。

extern NSString * LMJName = @"iOS开发者公会;

extern修饰的变量也可以添加const进行修饰:

extern NSString * const LMJName = @"iOS开发者公会;

此时全局变量只能被初始化一次
extern定义的全局常量的用法和宏定义类似,但是还是有本质上的不同的。 extern定义的全局常量更不容易在程序中被无意窜改。

版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

相关文章

网友评论

  • Hello_kid:这两种写法cons修饰的是* LMJName,*是指针指向符,也就是说此时指向内存地址是不可变的,而内存保存的内容时可变的 .
    -----
    你这句话说的不对吧; 在星号前的const修饰的是指针指向的内容不可变;指针的指向是可变的,在星号后的const 是对指针const;也就是说指针的指向不可变。 指针指向的内容是可变的; 不知我的理解是否有错;
  • 妙手空虚:这种误人子弟的文章,应该纳入网络诈骗进行处罚,写得全是错误
    ripperhe:我也是瞬间清醒了。。。
    189fe2c34c56:下午迷迷糊糊打着瞌睡看着这文章,看到你的评论瞬间清醒了
    _moses:估计又是一个复制粘贴党,真的难以理解。
  • Juice007:extern NSString * const LMJName = @"iOS开发者公会;
    这样写是不对的!会报错的!extern是不允许直接初始化的!
  • Mr_0:当我们希望一个变量的作用域不仅仅是作用域某个类的某个对象,而是作用域整个类的时候,这时候就可以使用静态变量。 这句话是什么意思
    好乐悦我:作用域某个类的某个对象和作用域整个类不是一样的意思吗?文章确实经不起推敲
  • 2ad4d4833970:“这两种写法cons修饰的是* LMJName,*是指针指向符,也就是说此时指向内存地址是不可变的,而内存保存的内容时可变的。”个人认为文中这句话不正确。LMJName是指针变量,而*LMJName是指针指向的变量的值。不过文中说的const修饰变量时的正确位置是没错的。当static NSString * const LMJName时,LMJName这个指针变量是不可修改的,当然这个指针所指向的值是不变的。当static NSString const * LMJName或static const NSString * LMJName时const修饰的是*LMJName,而*LMJName是指针LMJName所指向的内存中保存的值,这时*LMJName不可修改,而LMJName是可以修改的,即LMJName这个指针不指向原来的内存中的值了。个人看法,如不对请指出。
  • 像个被吓坏的孩子:能不能有 static const NSString* const str = @"一个地址不能变内容也不能变得字符串";
    Paco_Ke:有的,
  • 景天儿:“这两种写法cons修饰的是* LMJName,*是指针指向符,也就是说此时指向内存地址是不可变的,而内存保存的内容时可变的。”
    这句话说的稍微有一些模糊,事实上const修饰的是NSString。
    而“static NSString * const LMJName = @"iOS开发者公会";”中,const修饰的是NSString *,也就是指针本身是不可修改的。:blush:

本文标题:iOS定义静态变量、静态常量、全局变量

本文链接:https://www.haomeiwen.com/subject/hqtmlttx.html