Je sais que vous pouvez déclarer une fonction C en dehors d'une classe, mais est-il possible de déclarer un procédé de l'objectif-c en dehors d'une classe?
Exemple: P>
// Works
void printHelloC()
{
NSLog(@"Hello.");
}
// Error
-(void) printHelloOC
{
NSLog(@"Hello.");
}
int main (int argc, const char * argv[])
{
@autoreleasepool {
printHelloC();
[self printHelloOC];// 'self' obviously would not work but you get the idea
}
return 0;
}
5 Réponses :
Une méthode sans classe associée est un concept sans signification. Fonctions, comme vous l'avez noté, cela va bien. P>
Pas nécessairement vrai. Vous pouvez avoir un sélecteur qui effectue un code spécifique indépendant de ce que l'objet est, tant qu'il effectue une certaine tâche. C'est le raisonnement derrière les protocoles.
@ RICHARDJ.ROSSIII - Pour faire ce que vous décrivez sûrement, vous définissez sûrement une catégorie i> sur nsobject code>?
@CRD Pas nécessairement, vous pouvez faire la même chose avec l'addition de méthode (voir ma réponse). Ce qui est essentiellement une manière plus complexe de faire quelle est une catégorie.
Vous pouvez utiliser une catégorie em> pour cela. comme méthode d'instance: strong> p> bien sûr, vous devez associer qu'avec une classe - donc ce n'est pas exactement em> le même que Vous avez posté, mais c'est une définition étroite + une déclaration séparée de la déclaration de classe formelle. P> p>
Une catégorie étend simplement une définition de classe - toutes les méthodes déclarées dans la catégorie sont dans une classe ...
Votre nouvelle méthode est une méthode nstring code>. Ce n'est pas en dehors d'une classe - c'est à l'intérieur i> nstring code>!
+1. Catégories Étendez la classe avec des méthodes écrites à l'extérieur de la classe. C'est le but entier i> d'utiliser des catégories, après tout!
C'est vrai, mais ce n'est pas ce que demande l'OP.
Merci Alex. @Carl Oui, j'ai posté la catégorie car il s'agit d'un moyen courant d'étendre une classe existante. Voulez-vous répondre à la question de manière pédante, ou de manière pratique? Dans de nombreux cas, cette méthode «externe» est un moyen pratique d'accomplir ce dont vous avez besoin. Certaines personnes vont trouver utile.
Les fonctions d'objectif C sont toujours associées à une classe. Si vous voulez dire que vous souhaitez utiliser une fonction Objective-C sans instantiquer une classe, vous pouvez bien sûr écrire une méthode de classe (remarquez le signe plus au lieu de l'union habituelle) alors vous pouvez Appelez-le en appelant p> [Test aClassMethod];
Pas toujours vrai. Si vous utilisez la méthode Swizzling par exemple, vous pouvez ajouter une fonction à plusieurs classes avec plusieurs sélecteurs!
Peut-être ... mais la méthode Swizzling est un concept assez avancé et certainement pas quelque chose que vous devriez sans attention.
Ce n'est pas ce complexe, vous incluez simplement l'exécution, créez votre fonction et ajoutez la méthode à la classe avec un sélecteur. Cela ne prend pas un scientifique de fusée à faire et d'échanger des implémentations de méthodes est tout aussi facile.
Cela dépend. Vous pouvez faire quelque chose de similaire à la méthode d'additionner au moment de l'exécution:
#import <objc/runtime.h>
void myCustomMethod(id self, SEL _cmd, id arg1, id arg2)
{
NSLog(@"This is a test, arg1: %@, arg2: %@", arg1, arg2);
}
int main(int argc, char *argv[])
{
Class NSObjClass = [NSObject class];
class_addMethod(NSObjClass, @selector(myNewMethod::), (IMP) myCustomMethod, "v@:@@");
NSObject myObject = [NSObject new];
[myObject myNewMethod:@"Hi" :@"There"];
[myObject release];
return 0;
}
Bonne réponse, mais votre nom de méthode est un peu mal informatique, car c'est en fait une méthode pas un sélecteur
Non, ce n'est pas possible, vous devrez utiliser des méthodes globales de fonctions C ou de classe (+). p>
Il est possible, l'exécution de l'objectif-C vous permet d'ajouter des méthodes à une classe même si le programme est exécuté. Il vous permet même de créer de nouvelles classes entières. Vous pouvez définir une implémentation de méthode de l'objectif-C, puis associer cette méthode avec une classe et un sélecteur.
Oui, il est en effet possible de créer des cours de manière dynamique. Ce n'est pas la question, cependant. La question est de savoir s'il est possible de définir et d'exécuter des méthodes de l'objectif-C A-LA GLOBALY C Fonctions (ou, par exemple, des fermetures javascript scopées globalement). Ce n'est pas possible. Les méthodes Objective-C doivent être définies dans le cadre d'une classe (classe ou instance Scoped).