警告很重要吗?

时间:2009-09-05 00:08:24

标签: objective-c

编辑:我现在已经修复了两个警告,所以感谢大家的建议和鼓励。我留下的两个警告要求我更改数据库:

/Locations.xcdatamodel:tiles.Map:warning:瓷砖。地图 - 关系没有反转

/Locations.xcdatamodel:Waypoint.description:warning:Waypoint.description - 属性名称与NSObject或NSManagedObject上已有的方法冲突

我有一个iPhone应用程序,当我编译它时会抛出超过100个警告,但它经过时间考验并且非常可靠。

我应该关心警告吗?

编辑因为受访者问,以下是我的一些警告:

Warning: Multiple build commands for output file /Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/build/Debug-iphonesimulator/Gaia Places.app/wrench.png

/Locations.xcdatamodel:tiles.Map: warning: tiles.Map -- relationship does not have an inverse 

/Locations.xcdatamodel:Waypoint.description: warning: Waypoint.description -- property name conflicts with a method already on NSObject or NSManagedObject 

/TrailTrackerAppDelegate.m:58: warning: passing argument 1 of 'initWithViewController:withTitle:' from distinct Objective-C type
/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TrailTrackerAppDelegate.m: In function '-[TrailTrackerAppDelegate applicationDidFinishLaunching:]':

/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TrailTrackerAppDelegate.m:202: warning: no '-initWithFrame:forHelpScreen:' method found
/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TrailTrackerAppDelegate.m:202: warning: (Messages without a matching method signature

/TrailTrackerAppDelegate.m:329: warning: 'gpsController' may not respond to '-setAccuracy:'
/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes

/TrailTrackerAppDelegate.m:411: warning: local declaration of 'tabBarController' hides instance variable

/TrailTrackerAppDelegate.m:422: warning: 'TrailTrackerAppDelegate' may not respond to '-getAudioPlayer:'

/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TrailTrackerAppDelegate.m:633: warning: 'Reachability' may not respond to '-isHostReachable:'

/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TrailTrackerMapView.h:18: warning: 'myTopoMapSource' defined but not used

warning: 'dbCache' defined but not used

/TrailTrackerAppDelegate.m:58: warning: passing argument 1 of 'initWithViewController:withTitle:' from distinct Objective-C type
  /Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes

/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TripViewController.m:68: warning: 'TripViewController' may not respond to '-checkForNullImages'

/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/TripViewController.m:94: warning: 'TrailTrackerAppDelegate' may not respond to '-blamblamblam'

/Users/andrewljohnson/Desktop/thetrailbehind/TrailTracker/Classes/MapViewController.m:406: warning: passing argument 1 of 'initWithData:' from distinct Objective-C type

8 个答案:

答案 0 :(得分:8)

是。一些警告可能很重要。

最佳做法是将编译器的警告级别设置为最高设置,并尝试消除所有警告。

如果通过重构代码无法删除警告,并且已经检查并认为它是安全的,那么许多语言都会“pragma”来使警告静音。

大约2014年更新:打开一个将所有警告视为错误的编译器选项越来越常见。我个人这样做。

答案 1 :(得分:4)

我的直觉回答绝对是,全心全意的。

编译器警告可以帮助您编写清晰且可维护的代码,减少以后引入错误或在运行时出现错误的可能性。

编译器通常会捕获诸如未使用的变量,访问未初始化的变量,无法从函数中正确返回等内容。这些事情现在或者在测试中可能不是问题,但可能很容易出现并在以后搞砸了。

我会经历这些警告并试图解决它们。这将花费时间。

答案 2 :(得分:2)

其中许多警告看起来像你程序中无关紧要的内容。然而,当你有100个警告时,你知道无所谓(我不是说所有这些都没关系,我只是在说明)并警告101这是非常真实的 - 很可能你不是去看看。

我绝不容忍任何警告。有时这意味着添加无用的一行或两行代码,因为编译器无法看到条件必须执行等。 (在我写这篇文章时我面前的情况:一个随机数开关中的4个路径.4个中的1个必须执行,每个都为变量赋值。编译器不知道它必须有一个值因此我添加了一个无关的任务来关闭它。)

答案 3 :(得分:1)

大声笑我想这取决于警告是什么!!

如果你有超过100但运行得很好,我猜他们可能警告类型为“对象xxx可能无法响应消息yyy” - 即你在应用中创建的新方法有没有在标头中设置适当的声明,因此您的编译器无法检查它们是否是有效的方法调用(或更准确地说,是发送到您的自定义类的消息)。

Objective-C中的许多警告实际上警告您将导致应用程序崩溃的错误 - 事实上,在XCode中甚至有一个选项可以“将所有警告视为错误”。您的应用运行的事实表明您没有遇到此问题(或至少,还没有)。

然而,即使你所有的警告都是良性的(我怀疑),也有充分的理由来修复它们。如果它的类方法,你将能够找到之前你遇到崩溃,无论你是否向它发送有效的消息。对于大多数其他类型的警告,你最好不要了解它。

我想最后一个例外是你使用了很多弃用的方法。那么你可能会决定离开它们,尽管这又是一个冒险的策略。

所以我们回到起点 - 它取决于它们是什么!但是,我99%肯定这将是一个值得修复它们的练习。他们在那里帮助你,而不是它!

答案 4 :(得分:1)

肯定是的。否则为什么会被称为警告?

答案 5 :(得分:1)

如果我能给ObjC开发人员一条建议,那就是“总是使用访问者”。但如果我能给他们两条建议,那么第二部分就是“开启'将警告视为错误'。”

在Cocoa中维持零警告政策可能是我所知道的最佳成本/收益权衡。很少有警告在Cocoa中无法轻易修复。在编写可移植的C ++时,避免警告通常非常具有挑战性(有时几乎不可能),但Cocoa在两个非常相似的平台上有一个编译器。在Cocoa中几乎没有什么需要做的,应该是跳过默认的警告集。

警告会发出警告。当你说“嗯,我知道那些121警告并且它们没问题”时,当它变成122警告并且新警告确实很重要时很容易错过。如果您有确实需要解决的警告,请禁止警告,但不要在构建输出中忽略它们。

我的团队发出警告非常高,随着时间的推移,我们不得不将它们调整回来,但我们仍然在以下警告标志下在Mac和iPhone上构建主要的Objective-C ++项目。其中有一些当然可以用于特定项目,但这是我团队的默认设置,我们不会花很多钱。在我对project templates的讨论中,我再谈一谈。其中的zip文件包含Shared.xcconfig,其中记录了每个文件的功能以及启用或禁用的原因。但Xcode给出的默认设置是最小值。

GCC_TREAT_WARNINGS_AS_ERRORS = YES
WARNING_CFLAGS = -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wno-unknown-pragmas -Wextra-tokens -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wswitch-default -Wfloat-equal -Wpointer-arith -Wredundant-decls -Winvalid-pch -Wlong-long -Wdisabled-optimization
OTHER_CFLAGS = -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wundeclared-selector
OTHER_CPLUSPLUSFLAGS = -Wsign-promo -Wundeclared-selector
GCC_WARN_CHECK_SWITCH_STATEMENTS = YES
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES
GCC_WARN_64_TO_32_BIT_CONVERSION = YES
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES
GCC_WARN_ABOUT_RETURN_TYPE = YES
GCC_WARN_MISSING_PARENTHESES = YES
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES
GCC_WARN_SIGN_COMPARE = YES
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES
GCC_WARN_UNUSED_FUNCTION = YES
GCC_WARN_UNUSED_LABEL = YES
GCC_WARN_UNUSED_VALUE = YES
GCC_WARN_UNUSED_VARIABLE = YES
GCC_WARN_UNINITIALIZED_AUTOS = YES

答案 6 :(得分:1)

绝对。您应该始终解决警告。如果你做不到,你至少应该知道警告的原因以及为什么你可以忽略它。要忽略所有编译器消息,(尽管它们看似无害),只是一种灾难的处方。

答案 7 :(得分:0)