objective-c - the - swift 4 enum string
Constructor en Objective C (1)
La construcción predeterminada generalmente comienza con el siguiente formato -init
o cualquier variante sobre esto, por ejemplo, -initWithFrame:
El método +initialize
es un método de clase (método estático) que se llama al menos una vez cuando se inicia la aplicación. Puede usar este método para inicializar variables estáticas que son útiles en todas las instancias de la clase. Este método puede ser útil para, por ejemplo, inicializar un caché compartido o un mapa de búsqueda compartido para una clase.
Para NSObject
el método -init
es el inicializador designado, pero para otras clases esto podría diferir. Apple documenta el inicializador designado en sus encabezados de clase utilizando la macro NS_DESIGNATED_INITIALIZER
. Por ejemplo, UIView
subclases de UIView
deberían reemplazar -initWithFrame:
e -initWithCoder:
lugar, ya que estos métodos están marcados como inicializadores designados.
Al crear subclases e implementar un inicializador designado personalizado, no se olvide de inicializar también la superclase. Por ejemplo, tengamos una subclase UIView
que tenga un inicializador designado personalizado -initWithFrame:title:
Lo implementaríamos de la siguiente manera:
// A custom designated initializer for an UIView subclass.
- (id)initWithFrame:(CGRect)frame title:(NSString *)title
{
// Initialize the superclass first.
//
// Make sure initialization was successful by making sure
// an instance was returned. If initialization fails, e.g.
// because we run out of memory, the returned value would
// be nil.
self = [super initWithFrame:frame];
if (self)
{
// Superclass successfully initialized.
self.titleLabel.text = title
}
return self;
}
// Override the designated initializer from the superclass to
// make sure the new designated initializer from this class is
// used instead.
- (id)initWithFrame:(CGRect)frame
{
return [[self alloc] initWithFrame:frame title:@"Untitled"];
}
Se pueden encontrar más detalles sobre la inicialización en el sitio web de desarrolladores de Apple:
Soy un principiante en el desarrollo de iPhone. Estaba probando este programa de muestra a continuación.
No estoy llamando al método inicial (+ vacío) e - (id) init en la clase B. Pero se llama automáticamente.
Es el - (void) intialise es igual al constructor predeterminado en el objetivo C.
¿El [super init] apunta al objeto NSO?
Si no estoy usando el método - (id) init, recibo una advertencia de que la clase está con una implementación incompleta.
ClassA.h
#import <Foundation/Foundation.h>
static int ab;
@interface ClassA : NSObject {
int a;
}
+ (void) initialize;
- (id) init;
- (void) displayNumOfInstance;
- (void) disp;
@end
ClassA.m
#import "ClassA.h"
@implementation ClassA
+ (void) initialize
{
ab=0;
}
- (id) init
{
self = [super init];
if (self!=nil) {
ab++;
}
return self;
}
- (void) displayNumOfInstance
{
NSLog(@"Number of instances of this class:%d",ab);
}
- (void) disp
{
NSLog(@"The value is %d",ab);
}
@end
ClassB.h
#import <Foundation/Foundation.h>
#import "ClassA.h"
@interface ClassB : ClassA {
}
- (void) display;
@end
ClassB.m
#import "ClassB.h"
@implementation ClassB
- (void) display
{
ab=20;
NSLog(@"The value ab is %d",ab);
}
@end
clase2.m
#import <Foundation/Foundation.h>
#import "ClassA.h"
int main (int argc, const char * argv[]) {
ClassA *a = [[ClassA alloc]init];
[a disp];
[a release];
ClassB *b = [[ClassB alloc]init];
[b display];
[b release];
ClassA *a1 = [[ClassA alloc]init];
[a1 disp];
[a1 release];
ClassB *b1 = [[ClassB alloc]init];
[b1 display];
[b1 release];
return 0;
}
Salida:
2011-04-30 15:31:42.490 class2[1674:a0f] 1
2011-04-30 15:31:42.493 class2[1674:a0f] The value ab is 20
2011-04-30 15:31:42.494 class2[1674:a0f] 2
2011-04-30 15:31:42.495 class2[1674:a0f] The value ab is 20