J'essaie de créer un objet instanciable uniquement par une méthode d'usine. J'ai empêché init
d'être utilisé en lançant une exception (voir Creating a class with no init method). Cependant, cela signifiait que je devais créer une nouvelle méthode secretInit à utiliser dans la méthode d'usine. Cette méthode est désordonnée et bien que nous puissions éviter de déclarer secretInit dans le fichier d'en-tête, quelqu'un pourrait toujours y accéder. Y a-t-il une meilleure solution? Une idée est d'essayer d'appeler directement sur le super objet de URLReqs plutôt que de créer une fonction pour le faire.Objet uniquement initialisable par la méthode usine (Objective-c)
Répondre
Vous ne voulez pas le faire de cette façon, mais il est possible:
#include <objc/message.h>
@implementation MyClass
+ (id) factoryMethodWithParameter:(NSString *) someString;
{
struct objc_super instanceSuper;
id myInstance = [self alloc];
instanceSuper.receiver = myInstance;
instanceSuper.super_class = [self superclass];
// instanceSuper.class = [self superclass]; // use this line if the above doesn't compile
myInstance = objc_msgSendSuper (&instanceSuper, @selector(init));
//continue on setting up myInstance's ivars . . .
[myInstance setVariable:someString];
return myInstance;
}
- (id) init
{
self = [super init];
if (!self) return nil;
[self release];
[self doesNotRecogniseSelector:_cmd];
return nil;
}
@end
Cela vous permettra de continuer à envoyer des messages à init
“ super objet ” de myInstance
, mais ne permettre à quiconque d'envoyer init
à MyClass
instances. Attention cependant, bien que ce soit en utilisant les fonctions d'exécution standard déclarées dans objc/*.h
, ne vous attendez pas à ce que Apple conserve cette API d'exécution cohérente.
Pourquoi je ne veux pas utiliser cette méthode? – Casebash
Je ne sais pas pourquoi je vous ai dit de ne pas l'utiliser. . . – dreamlax
OH! Il est venu à moi maintenant. Je n'allais pas le recommander parce que c'est spécifique à l'exécution d'Apple. Si, par miracle, 'GNUstep' devenait supportable ou si d'autres runtimes devenaient disponibles, alors cette méthode pourrait ne pas être utilisable pour ces temps d'exécution. Je suppose que vous ciblez Mac OS X et/ou iPhone (je ne sais pas si cela fonctionnera sur iPhone), mais puisque vous avez seulement tagué votre question «objectif-c», je voulais laisser un avertissement. Puis j'ai oublié ce que j'écrivais et j'ai partiellement terminé ma pensée à la fin de ma réponse. – dreamlax
La solution consiste à utiliser une catégorie sur votre objet pour masquer la méthode d'initialisation secrète.
Private Methods through categories
Quel but que vous essayez d'accomplir? Il pourrait y avoir une meilleure solution que cela.
Cela ne cache pas la méthode, pas plus que de ne pas la déclarer. Il permet simplement à d'autres méthodes dans la classe de connaître son existence et donc vous n'obtenez pas d'avertissement du compilateur. – Casebash
Il ne l'expose que s'il est référencé dans le fichier d'en-tête.
Non, attendez. Je devrais dire cela d'une autre manière. Il n'y a pas de meilleure façon de le cacher que de ne pas le déclarer dans le fichier d'en-tête. Les méthodes privées n'existent pas en Objective-C.
- 1. printemps et objet usine
- 2. méthode usine de code
- 3. Méthode usine clarification Motif
- 4. Méthode statique usine statique [getInstance()] dans Java?
- 5. Méthode usine modèle en utilisant Generics-C#
- 6. Personnalisation de writeToFile dans ObjectiveC
- 7. méthode usine retour une instanciation concrète d'un modèle C++ classe
- 8. MVC utilisé dans la programmation ObjectiveC
- 9. Le moment de l'appel de la méthode de la super classe est-il important dans ObjectiveC?
- 10. Utilisation de la méthode "clear" par rapport au nouvel objet
- 11. appeler une méthode d'un objet à la création par exemple
- 12. Auriez-vous une usine pour ces méthodes. Méthode statique sur le type ou en usine?
- 13. Combine chaîne en ObjectiveC
- 14. Analyseur AMF0 dans ObjectiveC
- 15. NSString question ObjectiveC
- 16. Syntaxe ObjectiveC pour la spécification du nom du protocole dans la méthode Argument
- 17. usine d'objet qui génère un objet ou d'une liste d'objets
- 18. alloca et ObjectiveC Garbage Collector
- 19. Quand la méthode d'usine est-elle meilleure que la simple usine et vice versa?
- 20. Reliure ObjectiveC classe C# problème
- 21. Quel est l'avantage d'avoir toutes mes classes instanciées uniquement via le DP usine?
- 22. Contrôleur comme usine ascx - mauvaise idée?
- 23. Usine générique en C++
- 24. usine générique
- 25. Résumé Usine Question
- 26. Usine de formes multiples Django
- 27. Comment déclarer la méthode de type usine dans la classe de base?
- 28. usine abstraite avec framework Spring
- 29. Comment modifier uniquement la partie protocole d'un objet java.net.URL?
- 30. Puis-je demander à Hibernate de créer un objet en usine?
Je pense que votre méthode 'buildURLReq:' est supposée renvoyer 'tmp', pas' nil'. – dreamlax