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

    /*
 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 demo中的示例4

推荐答案

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

然而,初始化语句只执行一次.

此代码在第一次使用函数时将dateFormatter初始化为nil.在以后每次调用函数时,都会根据dateFormatter的值进行判断.如果没有设置(只有第一次才是真的),就会创建一个新的日期格式化程序.如果已设置,则将使用静态dateFormatter变量.

熟悉静态变量是值得的.它们可能非常方便,但也有缺点(例如,在本例中,不可能发布dateFormatter对象).

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

Objective-c相关问答推荐

使用 AVAudioplayer 在后台播放音乐

Objective-c中release和dealloc的区别

是否可以 suppress Xcode 4 静态分析器警告?

Objective-C:在字符串中查找数字

ARC下归零弱引用的集合

NSPredicate 与整数比较

测试应用程序是否确实从 UILocalNotification 变为活动状态

使用自动布局以编程方式更改框架

不区分大小写的核心数据 CONTAINS 或 BEGINS WITH 约束

Objective C 静态类变量

iOS:使用设备修饰符加载 xib 文件?

自定义 UISwitch 和 App Store 批准

从 UIPageViewController 中移除视图控制器

发出许多网络请求的 iOS 应用程序的最佳架构?

滑动删除单元格导致 tableView 标题随单元格移动

何时在 iPhone 上使用 UIView 与 UIViewController?

单例释放方法产生警告?

Objective-C 中的同步和异步调用与多线程有什么区别?

Xcode没有编译任何项目? 'clang 失败,退出代码 255'

带有Go按钮而不是返回的 iOS 键盘