当前位置:  开发笔记 > 编程语言 > 正文

在定义缓存变量时,在objective-c中使用static关键字

如何解决《在定义缓存变量时,在objective-c中使用static关键字》经验,为你挑选了2个好方法。

我正在看以下苹果示例源代码:

    /*
 Cache the formatter. Normally you would use one of the date formatter styles (such as NSDateFormatterShortStyle), but here we want a specific format that excludes seconds.
 */
static NSDateFormatter *dateFormatter = nil;
if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"h:mm a"];
}

试图找出:

为什么要使用static关键字?

如果在每次调用方法时将其设置为nil,这相当于缓存变量.

代码来自Tableview Suite演示中的示例4



1> Andrew Grant..:

静态变量在重复调用函数时保留其赋值.它们基本上就像只对该功能"可见"的全局值.

但初始化语句只执行一次.

此代码在第一次使用函数时将dateFormatter初始化为nil.在对函数的每次后续调用中,都会根据dateFormatter的值进行检查.如果未设置(仅在第一次时为true),则会创建一个新的dateFormatter.如果已设置,则将使用静态dateFormatter变量.

值得熟悉静态变量.它们可以非常方便但也有缺点(在这个例子中,例如,不可能释放dateFormatter对象).

只是一个提示:有时,在代码中放置断点并查看正在发生的事情可能很有教育意义.随着程序复杂性的增加,这将成为一项宝贵的技能.



2> Jim Puls..:

" static"在功能上意味着"不要在每次通过时评估等号右侧的东西,而是使用其先前的值"在这种情况下.

使用这个巨大的力量负有很大的责任:你冒着使用大量内存的风险,因为这些东西永远不会消失.除了像这样的情况之外,它很少适用NSDateFormatter.


我知道这是老问题,但想知道这个静态关键字与ARC有关的影响?
@codejunkie静态存储在与堆不同的位置.ARC关注保留和释放堆内存,以便值可以超出堆栈帧.因此,我怀疑ARC对静态变量有任何影响.
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有