OC传nil出现空警告怎么办

4,672 阅读1分钟

我就传个nil,你就给我一个警告,看到警告,我就要消除你

空警告

Null passed to a callee that requires a non-null argument

我在方法传参数的时候,就给我这个警告,这个警告翻译意思就是传递给需要非空参数的被调用者为空值。谷歌翻译的就是这样,其实意思就是我参数是非空的,你传个空的参数给我,我就要给你警告。

这么一想,感觉swift是不是就好多了,对于这方面的安全也做的更好了。

问题解决

既然我想传空的过去,那我在参数里面允许为空就好。

+ (void)didClicklink:(NSString *)link fromVC:(nullable UIViewController *)vc;

在参数那里,添加nullable就好。

那为什么会收到警告呢,我们往下看。

拓展

问题是解决了,那现在我们就开始拓展一下空与非空的知识点吧。

nullable

nullable,可空。我们定义方法或者属性都可以使用nullable来允许参数为空。

@property (nonatomic, copy, nonnull) NSString *name;

- (void)test:(nullable NString *)string;

nonnull

nonnull,不能为空。也是可以定义方法或者属性。

@property (nonatomic, copy, nonnull) NSString *name;

- (void)test:(nonnull NString *)string;

null_resettable

null_resettable,set方法可为空,get方法不能为空。

@property (nonatomic, copy, null_resettable) NSString *name;


- (NSString *)name
{
    if (_name == nil ) {
        return @"张三";
    }
    return _name;
}

null_unspecified

null_unspecified,不确定是否为空。

@property (nonatomic, copy, null_unspecified) NSString *name;

NS_ASSUME_NONNULL

我们在新建一个New File ,都会看到被NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END包住。

#ifndef NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#endif
#ifndef NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")
#endif

意思是在这里面修饰的属性,默认都为nonnull。当编译时,如果为空,就会收到警告。

大结局了,水落石出了,这就是为什么我们要对参数赋值为nullable,让参数为空,而不会收到警告了。