在Objective-C中,我的理解是指令@"foo"定义了一个常量字符串.如果我在多个地方使用@"foo",则引用同一个不可变的NSString对象.

为什么我经常看到这个代码片段(例如在UITableViewCell重用中):

static NSString *CellId = @"CellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:CellId];

而不仅仅是:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellId"];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:@"CellId"];

我认为这是为了防止我在标识符名称中输入一个编译器无法识别的错误.但如果是这样,我就不能:

#define kCellId @"CellId"

避免静态NSString*位?还是我错过了什么?

推荐答案

将文字转换为常量是一种很好的做法,因为:

  1. 就像你说的那样,这有助于避免拼写错误
  2. 如果你想改变常数,你只需要在一个地方改变它

我更喜欢使用static const NSString*static NSString* const,因为它比#define稍微安全一些.我倾向于避开预处理器,除非我真的需要它.

Objective-c相关问答推荐

Objective-C struct 的默认值以及如何测试

MKMapView zoom 到 viewDidLoad 上的用户位置?

为什么我不用 * 声明 NSInteger

isEqualTo: 和 isEqual 之间的区别:

在objective-c中创建现在的时间戳作为NSNumber

如何在 iOS SDK 中使用语音识别?

如何判断特定的 ViewController 视图当前是否可见?

如何在 iPhone 上默认显示数字键盘?

Obj-C 中的多值枚举

如何在 iPhone 上画出讲话泡泡?

在不导入自己的情况下播放系统声音

动画 UIButton 状态变化

主队列上的 performSelectorOnMainThread: 和 dispatch_async() 有什么区别?

NS_ASSUME_NONNULL_BEGIN 宏

-fembed-bitcode 在 6.0 之前的 iOS 版本上不受支持

@dynamic 在 Objective-C 中做了什么?

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

如何将 printf 与 NSString 一起使用

Objective-C:如何向 NSURL 添加查询参数?

iOS中的活动生命周期相当于什么?