gpt4 book ai didi

objective-c - 在 objective-c 中,为什么 'typedef NSString * MyString' 优于 'typedef NSString MyString' ?

转载 作者:行者123 更新时间:2023-12-04 03:11:19 24 4
gpt4 key购买 nike

选项 1:typedef NSString MyString

选项 2:typedef NSString * MyString


问题

在 Objective-C 中,这两种说法都是有效的,但据我所知,人们绝大多数选择选项 2 而不是选项 1。这是否有技术原因,或者它更像是一种约定?


为什么我更喜欢选项 1

选项 2 隐藏了 MyString 是一个指针这一事实。这可能是意图,但在 objective-c 中,您经常想知道您是在处理原始类型还是引用类型。

在 C 中,至少惯例是给它起一个类似 MyStringRef 的名称,以强调它是一个指针,但我认为我从未见过有人在 objective-c 中这样做。


但是选项 1 与 Swift 的配合并不好

然后是 swift 。桥接到 swift 时,选项 1 和选项 2 都工作得很好,但是如果我尝试将选项 1 标记为枚举-
typedef NSString MyString NS_STRING_ENUM;
FOUNDATION_EXPORT MyString * const MyStringOne;

编译器开始崩溃。语法高亮和自动完成总是中断。像 var x = MyString.one 这样的东西直接让编译器窒息,只留下 Segmentation fault: 11 错误。

最佳答案

在 Objective-C 中声明“字符串枚举”时使用此模式是正确的。

你问为什么在 typedef 中包含 * 是首选。

通常原因只是主观偏好之一,这两种方法都是有效的。请注意,Core Foundation 使用诸如 CFStringRef 之类的类型名称,其中隐藏了 * 但名称包含 Ref 来指示这一点,但 Objective-C 确实如此不遵循和使用 NSStringRef

但是您找到了一个客观的理由来遵循通常的模式 - Swift 编译器(至少在我使用的 Xcode 8.2.1 和您使用的 Xcode 中)是一个敏感的生物并且会自爆如果您使用其他模式,则会出现内存错误。

首先向 Apple 提交错误(如果有,请先在 Xcode 9 中测试)。

然后坚持“首选”模式,除非你喜欢看 Swift commit compilercide ;-)

关于objective-c - 在 objective-c 中,为什么 'typedef NSString * MyString' 优于 'typedef NSString MyString' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45063451/

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