Je souhaite utiliser un sélecteur sur une instance NSObject sans avoir besoin d'un protocole implémenté. Par exemple, il existe une méthode de catégorie qui devrait définir une propriété d'erreur si l'instance NSObject sur laquelle elle est appelée la prend en charge. Voici le code et le code fonctionne comme prévu:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Cependant, le compilateur ne voit aucune méthode avec la signature setError:, donc il me donne un avertissement, pour chaque ligne qui contient l' @selector(setError:)
extrait de code:
Undeclared selector 'setError:'
Je ne veux pas avoir à déclarer un protocole pour me débarrasser de cet avertissement, car je ne veux pas que toutes les classes qui peuvent l'utiliser implémentent quelque chose de spécial. Juste par convention, je veux qu'ils aient une setError:
méthode ou une propriété.
Est-ce faisable? Comment?
Salutations,
EP
la source
Réponses:
Une autre option serait de désactiver l'avertissement avec:
Vous pouvez placer cette ligne dans le fichier .m où l'avertissement se produit.
Mettre à jour:
Cela fonctionne également avec LLVM comme ceci:
la source
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// Do your thing
#pragma clang diagnostic pop
#pragma clang diagnostic ignored "-Wselector"
Jetez un œil à NSSelectorFromString .
Cela vous permettra de créer un sélecteur au moment de l'exécution, plutôt qu'au moment de la compilation via le
@selector
mot - clé, et le compilateur n'aura aucune chance de se plaindre.la source
sel_registerName()
truc semble obscur et le genre que vous ne devriez pas appeler directement à moins de savoir ce que vous faites, un peu comme obj_msg_send ();)Je pense que c'est parce que pour une raison étrange, le sélecteur n'est pas enregistré avec le runtime.
Essayez d'enregistrer le sélecteur via
sel_registerName()
:la source
NSSelectorFromString
appelle quand mêmesel_registerName()
sous le capot. Choisissez celui qui vous convient le mieux.sel_registerName()
directement est plus explicite sur la raison pour laquelle vous le faites.NSSelectorFromString
ne vous dit pas qu'il va tenter d'enregistrer le sélecteur.J'ai reçu ce message en # incluant le fichier avec la méthode. Rien d'autre n'a été utilisé à partir de ce fichier.
la source
Je me rends compte que je suis un peu en retard dans ce fil, mais pour être complet, vous pouvez désactiver globalement cet avertissement en utilisant les paramètres de construction cible.
Dans la section 'Avertissements Apple LLVM - Objective-C', modifiez:
la source
Si votre classe implémente la méthode setError: (même en déclarant dynamic le setter de la propriété d'erreur éventuelle), vous voudrez peut-être la déclarer dans votre fichier d'interface (.h), ou si vous n'aimez pas l'afficher de cette façon, vous pouvez essayez avec l'astuce délicate de PrivateMethods:
juste avant votre @implementation, cela devrait masquer les avertissements;).
la source
PerformSelector may cause a leak because its selector is unknown
Une macro vraiment confortable à mettre dans votre
.pch
ouCommon.h
ou où vous voulez:C'est une modification de cette question pour un problème similaire ...
la source
Vous pouvez le désactiver dans Xcode comme dans la capture d'écran:
la source
Vous pouvez également convertir d'abord l'objet en question en un identifiant pour éviter l'avertissement:
la source
Une autre façon d'éviter cet avertissement est de vous assurer que votre méthode de sélection ressemble à ceci:
N'oubliez pas "(id) sender" si vous voulez accepter un expéditeur ou spécifier un type d'objet expéditeur si vous préférez.
la source
Alors que la bonne réponse consiste probablement à informer Xcode via des importations ou à enregistrer le sélecteur qu'un tel sélecteur existe, dans mon cas, il me manquait un point-virgule. Assurez-vous avant de «corriger» l'erreur que l'erreur est peut-être correcte et que votre code ne l'est pas. J'ai trouvé l'erreur dans l'exemple MVCNetworking d'Apple, par exemple.
la source
J'ai pu faire disparaître l'avertissement en ajoutant aucune méthode (divulgation: je n'y ai pas pensé, mais je l'ai trouvée en recherchant sur google le timer avec intervalle de temps)
Bien que j'apprécie de savoir comment cacher l'avertissement, il est préférable de le réparer et ni les techniques de Sergio ni de Relkin n'ont fonctionné pour moi, pour des raisons inconnues.
la source