nonnull
适用于C函数,但不适用于obj-c方法。要明确,我建议这个
- (void)doSomethingWithRequiredString:(NSString * __attribute((nonnil)))requiredString
bar:(NSString *)optionalString);
或(更像是非空的)
- (void)doSomethingWithRequiredString:(NSString *)requiredString
bar:(NSString *)optionalString)
__attribute((nonnil(0)));
我对是否有一个很好的技术原因感到困惑。我知道clang只能真正使用该属性进行编译时检查或静态分析,但这似乎是正交的。是否有一些强烈的理由不有这个?
答案 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开始,支持更清晰的语法。
在属性和方法中,关键字为nullable
,nonnull
和null_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;