¿Es posible crear una clase sin método init para forzar a todos los llamantes a crear el objeto con un método de fábrica?Crear una clase sin método init (Objective-c)
Respuesta
Así que, básicamente, quiere asegurarse de que su clase nunca se inicie con -init, ¿verdad? No puede hacer exactamente lo que quiere hacer, pero puede acercarse.
Dado que heredas de NSObject, tienes un método init y no hay nada que puedas hacer para evitar que se llame.Dicho esto, se podía anular init para esto:
- (id)init
{
[self dealloc];
@throw [NSException exceptionWithName:@"MyExceptionName" reason:@"Reason" userInfo:nil];
return nil;
}
De esta manera, cada vez que alguien llama a su método init, que mata el objeto, por lo que en términos prácticos, el método init es más o menos un-exigible.
¿Object-c tiene algo así como una excepción no implementada? – Casebash
En realidad no necesita el retorno al final; nunca se alcanzará – Casebash
Objective-C es una excepción, poco amigable, ya que puede hacer que los objetos se filtren por todas partes (ya que sus llamadas de 'liberación' nunca se pueden alcanzar) . Si no usas el tiempo de ejecución recolectado como basura, por triste que pueda sonar, es mejor que simplemente no los uses. – zneak
Sure. En Objective-C, no hay constructores reales. init
-los métodos de tipo se utilizan generalmente para inicializar una clase, en la misma línea que un constructor, pero son solo un método "normal" (no hay nada especial acerca de ellos como los hay, por ejemplo, los constructores de Java).
Dicho esto, a menos que su clase hace sin inicialización de sus casos, es probable que desee a tener algún tipo de init
método.
NSObject
implementa un método init
para usted que hace lo que hace. Si su clase no tiene nada que configurar cuando se crea una instancia, simplemente no anule el método -(id)init
provisto por NSObject
. Pero aún lo llamas cuando creas la instancia.
Depende. Si su clase hereda de NSObject
, tendrá el método heredado init
(que no hace nada con sus variables de instancia). Entonces, en ese sentido, incluso si realmente no quisiera tener un método init
, probablemente aún tenga uno. Entonces, si su pregunta era "¿Debo implementar un método trivial init
?", La respuesta es "no, no es necesario". Sin embargo, si su pregunta era "¿Tengo que llamar al método init
si no lo anulé?", La respuesta es "sí, lo hace". Hagas lo que hagas con las subclases de NSObject, en algún momento aún debes llamar al init
después de que se crea el objeto. Tal es la forma de vida.
Dicho esto, que lo más probable desea un método init
, a menos que su inicialización de objetos requiere nada más que la reducción a cero toda su objeto.
De lo contrario, si decide no Heredar del NSObject
o cualquiera de sus subclases y simplemente hereda de nada, lo cual es claramente una mala idea debido a cómo los NSObject
clase aborda todo lo que el tiempo de ejecución ObjC tiene que hacer y el los requisitos son bastante altos, entonces posiblemente terminará sin el método init
en total. Pero en serio, no intentes esto en casa.
Si realmente quería causar problemas para los usuarios de su clase que utilizan init
, que puede hacer:
@implementation MyClass
- (id) init
{
// Still have to make sure the runtime has initialised everything for "self"
self = [super init];
if (!self) return nil;
[self release]; // some say you should use [super dealloc]
[super doesNotRecognizeSelector:_cmd];
return nil;
}
@end
se invoca super
's doesNotRecognizeSelector:
porque es posible que desee poner en práctica su propio comportamiento para los selectores no reconocidos para Tu clase.
- 1. Configuración de primavera Método Init
- 2. objetivo-c método init predeterminado para la clase?
- 3. cómo extender Python init clase
- 4. crear una nueva instancia de una clase sin operador "nuevo"
- 5. ¿Está bien llamar a un método init en sí mismo, en un método init?
- 6. Hacer una clase singleton sin usar el método estático
- 7. ¿El método init de NSObject hace algo?
- 8. clase, dict, self, init, args?
- 9. Mock HttpContext.Current in Test Init Método
- 10. consiguiendo const en un método init
- 11. NSKeyedUnarchiver unarchiveObjectWithFile: devuelve nil en init: método
- 12. ¿Tiene sentido el momento de llamar al método de la clase superior en ObjectiveC?
- 13. ¿Comenzar con el método init o no?
- 14. Python: crear una instancia de clase sin invocar el inicializador
- 15. Cómo crear un método println/impresión para una clase personalizada
- 16. ¿Cómo crear un método de clase privado?
- 17. Haciendo una clase abstracta sin ningún método virtual puro
- 18. ¿Puedo cancelar una acción Zend Controller en el método init()?
- 19. Crear una instancia de clase con o sin paréntesis?
- 20. Crear un objeto sin llamar a una clase
- 21. Crear una clase de Ruby sobre la marcha sin eval
- 22. ¿Es posible crear un objeto sin declarar una clase?
- 23. Práctica recomendada, anulando __construct() versus método init()
- 24. Constructor de servlets y método init()
- 25. método init en el controlador ZF2
- 26. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 27. Crear método estático a partir de un método existente fuera de la clase? (error de "método sin encuadernar")
- 28. ¿Invocar un método de clase C++ sin una instancia de clase?
- 29. ¿Sería correcto/elogioso usar solo alloc sin init?
- 30. FakeItEasy Crear una falsificación de una clase
Puede ser útil explicar lo que realmente quiere lograr. – Chuck
Parece ser una pregunta perfectamente legítima para mí, que no necesita contexto para tener sentido. Hay muchas razones por las cuales tendría una clase que no necesitaría ninguna configuración específica. –
@Squeegy: Chuck tenía razón: la pregunta original debería haber explicado lo que quería lograr. De las respuestas a continuación, está claro que algunos de los que respondieron no estaban seguros de lo que estaba preguntando (de hecho, supervoto el comentario de Chuck) – Casebash