gpt4 book ai didi

objective-c - 了解已修复的错误 : Sending NSError *const __strong* to parameter

转载 作者:行者123 更新时间:2023-12-02 10:44:05 25 4
gpt4 key购买 nike

在写我最初的问题时,我无意中解决了我的问题。我想了解为什么我的更改会导致修复。

我写了一个接受 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() function 实际上是将表达式包装在一个 block 中的宏,那么这可能会导致编译器以这种方式提示。

然而 ,你的固定测试是错误的。

您无法测试 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com