忽略使用“warn_unused_result”属性声明的函数的返回值
Posted
技术标签:
【中文标题】忽略使用“warn_unused_result”属性声明的函数的返回值【英文标题】:Ignoring return value of function declared with "warn_unused_result" attribute 【发布时间】:2017-04-05 17:59:43 【问题描述】:我们开始在我们的 Objective-C 代码中的所有 becomeFirstResponder
函数调用上出现此警告。
[self.phoneNumberField becomeFirstResponder]; // warning here!!!
在此处抑制此警告的最佳方法是什么?
编辑:我也试过这个,
BOOL ignore = [self.emailField becomeFirstResponder];
但是,Xcode 警告变量ignore
没有被使用:(
我也试过了,
BOOL ignore = [self.phoneNumberField becomeFirstResponder];
if (ignore)
在这种情况下,警告消失了。但我认为我什至无法通过自己的代码审查。太丑了!
【问题讨论】:
永远不要将代码添加为图像。使其成为文本。 您实际上可以检查返回值并在返回NO
时执行某些操作。
@AminNegm-Awad 感谢您指出这一点。我已将其更新为文本而不是图像。
【参考方案1】:
应该可以将表达式转换为 void 表达式。
(void)[self.emailField becomeFirstResponder];
(即使我无法重现警告。但是,这可能取决于警告标志。)
您的编辑:
BOOL ignore = [self.emailField becomeFirstResponder];
可能
BOOL ignore = [self.emailField becomeFirstResponder];
ignore = ignore;
// or
(void)ignore;
应该删除警告。 (它与我的标志有关。)但是,这也是一个丑陋的黑客。
顺便说一句:属性是有原因的。也许你应该重新检查一下,是否是一个好主意,而不是测试返回值。
【讨论】:
这个警告的原因是什么?你知道吗? 因为方法是用warn_unused_result
修饰的,也就是说,如果结果未被使用,编译器应该发出警告。
(void)[self.emailField becomeFirstResponder];像魅力一样工作!【参考方案2】:
如果您有一个从 Objective-C 代码调用的 Swift 函数,您可能会收到此警告。您可以通过在 Swift 中的函数前添加 @discardableResult
来使其静音,如下所示:
@objc @discardableResult func yourFanzyFuncInSwift(argument: String) -> Bool ...
似乎 warn_unused_result 是 Swift 中的默认设置,这意味着您不应该编写忽略返回值的代码。
【讨论】:
请注意,很遗憾您无法将@discardableresult 添加到init(),因此在调用它来创建共享实例单例时,但当时不使用它(您希望设置初始化副作用)您会收到此警告。 @chadbag 我相信来自 Apple 的信息在这里很清楚 - 你不应该初始化一个对象然后忽略它。我敢打赌这是重构代码的方法,这样可以避免这种情况。 如果你有一个单例并且在它第一次运行时需要一个副作用只是为了副作用,例如,请求各种Apple服务的权限,你可以声明一个变量并返回它然后永远不要使用该变量,或者您可以忽略返回值。将其转换为 (void) 效果很好。 此解决方案的优点是不必在每个调用点都撒(空)。【参考方案3】:使用关联对象
的魅力较小 代码部分: #import "objc/runtime.h"
#import <Foundation/Foundation.h>
@interface NSObject(Helper)
@property (nonatomic, assign) BOOL nonsense;
@end
@implementation NSObject(Helper)
- (void)setNonsense:(BOOL)val
NSNumber *obj = [NSNumber numberWithBool: val];
objc_setAssociatedObject(self, @selector(nonsense), obj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- (BOOL)nonsense
NSNumber *obj = objc_getAssociatedObject(self, @selector(nonsense));
return obj.boolValue;
@end
用法部分:
self.nonsense = [self.sessionInputView endEditing:YES];
【讨论】:
以上是关于忽略使用“warn_unused_result”属性声明的函数的返回值的主要内容,如果未能解决你的问题,请参考以下文章
__attribute__ ((warn_unused_result)) 的 Visual Studio 等效项
warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-resu