在写原始问题时,我无意中解决了问题。我想了解为什么我的更改导致了此修复程序。

我写了一个接受NSStringNSError **的类方法。如果该字符串是我的应用程序中的有效密码,则该方法返回YES;否则返回NO。如果返回NO,则在方法内部设置通过引用传递的NSError

这是验证方法:

@interface PasswordValidator

+ (BOOL)isValid:(NSString *)password error:(NSError **)error {

    NSError *err = nil;

    if (!password || password.length < 1) {
        err = [NSError errorWithDomain:...];
    }

    // Rest of logic omitted for brevity

    if (err) {
        if (error) {
            *error = err;
        }
        return NO;
    }

    return YES;
}
@end

在测试中,我错误地尝试检查NSError对象的存在,如下所示:
    it(@"should set error if password is nil", ^{
        NSError *error;
        expect([PasswordValidator isValid:nil error:&error]).toNot.beNil();
    });

忽略测试包含逻辑错误的事实,该代码使编译器抱怨以下错误:Sending NSError *const __strong* to parameter of type 'NSError *__autoreleasing* changes retain/release properters of pointer

更新测试以使PasswordValidator:isValid:error的调用在单独的一行上发生后,错误消失了:
    // The test below did not cause compilation issues.
    it(@"should return NO if password is nil", ^{
        NSError *error;
        [HAYPasswordValidator isValid:nil error:&error];
        expect(error).toNot.beNil();
    });

我的问题是,为什么编译器最初会抱怨,将方法调用分离到可以解决问题的单独行中又是什么呢?

最佳答案

您正在使用什么测试装置?如果该expect()函数实际上是一个将表达式包装在一个块中的宏,则可能会导致编译器以这种方式抱怨。

但是,您的固定测试错误。

您无法直接测试nil/non-nil的错误。仅当该方法返回error(或NO,通常-表示错误的任何值)时,才会将nil设置为定义的值。然后,只有这样,才能定义error

考虑您的isValid:error:方法的实现。如果没有错误,则不触摸error参数。如果在输入该方法时未初始化error,则在成功情况下仍将未初始化它,并且如果仅测试error本身就不会使您的测试用例失败。

关于objective-c - 了解固定错误: Sending NSError *const __strong* to parameter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29721347/

10-11 22:14
查看更多