我想知道这是否是一个好习惯:
我有一个接受参数和回调块的方法,让我们说一下:
-(void)loginWithUsername:(NSString *)username andPassword:(NSString *)password withCompletion:(LoginManagerCompletionBlock)completionHandler;
现在在这种特定情况下,没有完成处理程序就没有用于调用此方法,因为它触发了对登录Web服务的冗余调用(同样,它不会改变任何状态 - 不是客户端也不是服务器侧)。我想通过主动强制要求传递完成块以便进行此Web服务调用来避免这些情况。我有点认为这是Objective C协议中的“@required”方法。所以我的问题是:
由于
答案 0 :(得分:7)
您可以使用函数属性nonnull(params)
,其中 params 是一个或多个以逗号分隔的参数编号,以指示参数不应为空(nonnull
括号表示所有指针参数不应为null)。以你的例子:
- (void) loginWithUsername:(NSString *)username
andPassword:(NSString *)password
withCompletion:(LoginManagerCompletionBlock)completionHandler
__attribute__((nonnull(3)));
然而,虽然这是一个编译时检查并产生一个警告,但只有在直接传递null时才会这样做。如果参数值是一个计算结果为null的表达式,例如一个具有空值的变量,然后就不会被捕获。
如果参数为null是错误,您可以使用NSParameterAssert(parameter)
在方法本身中添加运行时检查,其中参数是方法参数之一的名称,以检查这种情况。此调用被定义为打印错误消息,如果其参数的计算结果为false,则抛出异常,并且null的计算结果为false。
答案 1 :(得分:3)
这正是NSParameterAssert
的用途。用它来检查参数是否为零。
NSParameterAssert( completionParameter );
尽管如此,在这种特定情况下,最好将完成处理程序记录为nil并返回。没有必要做任何额外的工作。您可能希望在开发过程中断言明显表明您有一个需要解决的问题。