在objective-c中,为什么'typedef NSString * MyString'比'typedef NSString MyString'更受欢迎?

时间:2017-07-12 16:47:34

标签: objective-c

选项1: typedef NSString MyString

选项2: typedef NSString * MyString

问题

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

为什么我更喜欢选项1

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

在C中,至少约定是给它一个像MyStringRef这样的名称来强调它是一个指针,但我认为我从未见过有人在objective-c中做过这样的事。

但是选项1与Swift

不能很好地配合

然后就是斯威夫特。 当桥接到swift时,选项1和选项2都可以正常工作,但是如果我尝试将option1标记为枚举 - typedef NSString MyString NS_STRING_ENUM; FOUNDATION_EXPORT MyString * const MyStringOne;

编译器开始吓坏了。语法高亮和自动完成会一直中断。像var x = MyString.one这样的东西会直接扼杀编译器,只留下 Segmentation fault:11 错误。

1 个答案:

答案 0 :(得分:1)

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

您问为什么在*中加入typedef是首选。

通常原因只是主观偏好之一,两种方法都是有效的。请注意,Core Foundation使用CFStringRef等类型名称,其中*被隐藏,但名称包含Ref以表明这一点,但Objective-C不遵循并使用NSStringRef

但是你发现目标的理由遵循通常的模式 - Swift编译器(至少在我使用的Xcode 8.2.1和你使用过的那个)是一个敏感的生物并且自我炒作如果使用其他模式,则会出现内存故障。

首先向Apple提交一个错误(如果你有的话,先在Xcode 9中测试)。

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