为什么clang没有'n​​onnil'属性?

时间:2013-10-04 16:00:11

标签: objective-c attributes clang

nonnull适用于C函数,但不适用于obj-c方法。要明确,我建议这个

- (void)doSomethingWithRequiredString:(NSString * __attribute((nonnil)))requiredString
                                  bar:(NSString *)optionalString);

或(更像是非空的)

- (void)doSomethingWithRequiredString:(NSString *)requiredString
                                  bar:(NSString *)optionalString)
__attribute((nonnil(0)));

我对是否有一个很好的技术原因感到困惑。我知道clang只能真正使用该属性进行编译时检查或静态分析,但这似乎是正交的。是否有一些强烈的理由有这个?

3 个答案:

答案 0 :(得分:26)

你完全可以。你做错的唯一一件事是认为方法参数是0索引的,而实际上它们是1索引的(哦,它是nonnull,而不是nonnil):

- (void)doSomethingWithRequiredString:(NSString *)requiredString
                                  bar:(NSString *)optionalString
        __attribute((nonnull(1)));

现在当你尝试使用它时:

id thing = ...;
[thing doSomethingWithRequiredString:nil bar:@"42"];

Xcode将通过说“Null传递给需要非空参数的被调用者”来警告您。

另外,如果省略__attribute的“(1)”部分,则假定非零要求适用于所有参数。

Clang识别GCC属性,GCC对nonnull属性的定义如下:http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html#index-g_t_0040code_007bnonnull_007d-function-attribute-1733


更新:从Xcode 6.3开始,支持更清晰的语法。

在属性和方法中,关键字为nullablenonnullnull_unspecified

所以你的方法签名会变成这样:

- (void)doSomethingWithRequiredString:(nonnull NSString *)requiredString
                                  bar:(nullable NSString *)optionalString;

答案 1 :(得分:0)

在Xcode 6.3 beta中,添加了新的Objective-C功能,以表达标题中的(非)可空性:https://developer.apple.com/swift/blog/?id=22

答案 2 :(得分:0)

是的。

您可以这样编码:

- (nullable AAPLListItem *)itemWithName:(nonnull NSString *)name;
- (NSInteger)indexOfItem:(nonnull AAPLListItem *)item;

https://developer.apple.com/swift/blog/?id=25