9

将 Xcode 更新到 5.1 版后,我收到一个警告,告诉我我定义了一个我没有使用的常量。它的定义如下所示:

static NSInteger const ABCMyInteger = 3;

我很高兴看到它被标记了,因为我认为这意味着编译器现在能够检查未使用的常量以及变量的局部变量。

我又重构了一些,使三个NSString常量过时了。这三个的定义与上面的定义非常相似NSInteger

static NSString *const ABCMyString = @"ABCMyString";

然而,令我惊讶的是,这些并没有被标记为“未使用”,尽管我确信它们不再被使用。

有人可以解释为什么NSInteger编译器会注意到 an 未使用,但 anNSString没有?

4

2 回答 2

2

原始变量只是在静态内存部分中分配并由编译器初始化的内存块。然而,字符串对象是在运行时(可能是在启动时)初始化的变量,因此编译器向构造函数添加了一个隐式调用,并将变量用作该调用的参数。所以这个变量正在被使用。

_unused结构的项目恕我直言不是指令,而只是一个成员变量,可能是为了更好的对齐而添加的(将对象大小填充为圆形大小)。

于 2014-03-26T06:42:48.457 回答
1

编译时文字的定义NSString依赖于NSSimpleCString元类的使用。这个类看起来像这样:

@interface NSSimpleCString : NSString {
@package
    char *bytes;
    int numBytes;
#if __LP64__
    int _unused;
#endif
}
@end

@interface NSConstantString : NSSimpleCString
@end

标志的添加_unused使我相信NSSimpleCString代码的进一步实现将指示编译器使用__unused.
您可以通过在您的整数或浮点常量前面加上以下内容来尝试自己__unused

__unused static const NSInteger ABCMyInteger = 3;

有关更深入的解释,请阅读Mike Ash关于文字的文章

于 2014-03-24T14:24:47.297 回答