在写原始问题时,我无意中解决了问题。我想了解为什么我的更改导致了此修复程序。
我写了一个接受NSString
和NSError **
的类方法。如果该字符串是我的应用程序中的有效密码,则该方法返回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/