gpt4 book ai didi

ios - static const 与 extern const

转载 作者:IT王子 更新时间:2023-10-29 08:10:32 24 4
gpt4 key购买 nike

我一直在我的头文件中使用静态常量:

static NSString * const myString = @"foo";

但已读到这不是“安全”或正确的做法。显然,如果我希望从另一个类访问我的 const 字符串,我应该在我的 .h 中将字符串声明为:

extern NSString * const myString;

然后在我的 .m 文件中:

NSString * const myString = @"foo";

这是正确的吗?如果是这样,不直接在我的 .h 文件中将其声明为静态的原因是什么?它工作得很好,我看不出有任何“安全”问题。它是一个 const,因此它不能从外部更改,它是我有意需要在类之外访问的东西。我唯一能想到的就是隐藏字符串的值?

最佳答案

你的第一个变体

static NSString * const myString = @"foo"; // In .h file, included by multiple .m files

每个“翻译单元” 中本地定义一个myString 变量(粗略地说:在每个.m 源文件中)包括头文件。所有字符串对象都具有相同的内容“foo”,但它可能是不同的对象,因此 myString 的值(指向字符串对象的指针)每个单元可能不同。

你的第二个变体

extern NSString * const myString; // In .h file, included by multiple .m files
NSString * const myString = @"foo"; // In one .m file only

定义一个“全局”可见的单个变量myString

示例:在一个类中,您使用 myString 作为用户对象发送通知。在另一个类中,收到此通知并将用户对象与 myString 进行比较。

在您的第一个变体中,必须用 isEqualToString: 进行比较,因为发送类和接收类可能有不同的指针(都指向一个NSString 对象,内容为“foo”)。因此与 == 比较可能会失败。

在您的第二个变体中,只有一个 myString 变量,因此您可以与 == 进行比较。

因此,从“共享字符串”是每个翻译单元中的相同对象的意义上来说,第二个变体更安全

关于ios - static const 与 extern const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23652665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com