Reputation: 1938
Here's a snippet:
NSArray *a = [@[@"a", @"b", @"c"] sortedArrayUsingSelector:@selector(compare:)];
XCode (5.0) is giving me the following warning:
Creating selector for nonexistent method 'compare:'
How do I eliminate these warnings?
Upvotes: 3
Views: 1419
Reputation: 12446
This warning is relevant for you and can be disabled in the build settings of your project. Set the value to NO and the warning is disabled.
-Wselector
Warn if multiple methods of different types for the same selector are found during compilation. The check is performed on the list of methods in the final stage of compilation. Additionally, a check is performed for each selector appearing in a @selector(...)
expression, and a corresponding method for that selector has been found during compilation. Because these checks scan the method table only at the end of compilation, these warnings are not produced if the final stage of compilation is not reached, for example because an error is found during compilation, or because the -fsyntax-only
option is being used.
These could also be interesting:
-Wundeclared-selector
Warn if a @selector(...)
expression referring to an undeclared selector is found. A selector is considered undeclared if no method with that name has been declared before the @selector(...)
expression, either explicitly in an @interface or @protocol
declaration, or implicitly in an @implementation section. This option always performs its checks as soon as a @selector(...)
expression is found, while -Wselector
only performs its checks in the final stage of compilation. This also enforces the coding style convention that methods and selectors must be declared before being used.
-Wstrict-selector-match
Warn if multiple methods with differing argument and/or return types are found for a given selector when attempting to send a message using this selector to a receiver of type id
or Class
. When this flag is off (which is the default behavior), the compiler will omit such warnings if any differences found are confined to types which share the same size and alignment.
You can disable the warning for only some lines of code with
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wselector"
... code which will ignore the warning
#pragma clang diagnostic pop
Or ignore it for only one file
#pragma GCC diagnostic ignored "-Wselector"
The selector is mostly dynamically created, when this error occurs. Sometimes it works for me to create a static selector:
SEL selector = NSSelectorFromString(@"compare:");
[self fireDelegateSelector:selector];
or
SEL selector = sel_registerName("compare:");
[self fireDelegateSelector:selector];
Upvotes: 7