Buscar..


Sintaxis

  • Cat * cat = [[Cat alloc] init]; // Crear el objeto cat del tipo Cat
  • Dog * dog = [[alloc del perro] init]; // Crear un objeto de tipo perro.
  • NSObject * someObject = [NSObject alloc]; [someObject init]; // no hagas esto
  • XYZObject * object = [XYZObject new]; // Use new para crear objetos si NO se necesitan argumentos para la inicialización
  • NSString * someString = @ "¡Hola mundo!"; // Creando una NSString con sintaxis literal
  • NSNumber * myFloat = @ 3.14f; // Otro ejemplo para crear un NSNumber usando sintaxis literal
  • NSNumber * myInt = @ (84/2); // Crear un objeto usando una expresión en caja

Creación de clases con valores de inicialización.

#import <Foundation/Foundation.h>
@interface Car:NSObject {
    NSString *CarMotorCode;
    NSString *CarChassisCode;
}

- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode;
- (void) startCar;
- (void) stopCar;

@end

@implementation Car

- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode{
    CarMotorCode = motorCode;
    CarChassisCode = chassisCode;
    return self;
}

- (void) startCar {...}
- (void) stopCar {...}

@end

El método initWithMotorValue: type andChassisValue: type se utilizará para inicializar los objetos Car.

Clase Singleton

¿Qué es una Clase Singleton?

Una clase de singleton devuelve la misma instancia sin importar cuántas veces la solicite una aplicación. A diferencia de una clase regular, un objeto singleton proporciona un punto global de acceso a los recursos de su clase.

¿Cuándo usar las clases de Singleton?

Los Singletons se usan en situaciones donde este único punto de control es deseable, como en las clases que ofrecen algún servicio o recurso general.

Cómo crear clases singleton

Primero, crea un archivo Nuevo y NSObject de NSObject . Nombra algo, usaremos CommonClass aquí. Xcode ahora generará los archivos CommonClass.h y CommonClass.m para usted.

En su archivo CommonClass.h :

#import <Foundation/Foundation.h>

@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end

En su archivo CommonClass.m :

#import "CommonClass.h"

@implementation CommonClass

+ (CommonClass *)sharedObject {
    static CommonClass *sharedClass = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClass = [[self alloc] init];
    });
    return sharedClass;
}

- (id)init {
    if (self = [super init]) {
        self.commonString = @"this is string";
    }
    return self;
}

@end

Cómo usar las clases de Singleton

Podrá acceder a la Clase Singleton que creamos anteriormente desde cualquier parte del proyecto siempre que haya importado el archivo CommonClass.h en el módulo correspondiente. Para modificar y acceder a los datos compartidos en Singleton Class, tendrá que acceder al Objeto compartido de esa clase, al que se puede acceder mediante el método sharedObject , como se sharedObject a continuación:

[CommonClass sharedObject]

Para leer o modificar los elementos en Clase compartida, haga lo siguiente:

NSString *commonString = [[CommonClass sharedObject].commonString; //Read the string in singleton class

NSString *newString = @"New String";
[CommonClass sharedObject].commonString = newString;//Modified the string in singleton class

El tipo de retorno "instancetype"

Objective-C admite un tipo especial llamado `instancetype que solo se puede usar como tipo devuelto por un método. Se evalúa a la clase del objeto receptor.

Considere la siguiente jerarquía de clases:

@interface Foo : NSObject

- (instancetype)initWithString:(NSString *)string;

@end

@interface Bar : Foo
@end

Cuando se [[Foo alloc] initWithString:@"abc"] , el compilador puede inferir que el tipo de retorno es Foo * . La clase Bar derivó de Foo pero no anuló la declaración del inicializador. Sin embargo, gracias al tipo de instancetype , el compilador puede inferir que [[Bar alloc] initWithString:@"xyz"] devuelve un valor de tipo Bar * .

Considere el tipo de retorno de -[Foo initWithString:] siendo Foo * lugar: si llamara a [[Bar alloc] initWithString:] , el compilador [[Bar alloc] initWithString:] que se devuelve un Foo * , no un Bar * como es la intención de desarrollador. El tipo de instancetype resolvió este problema.

Antes de la introducción de instancetype , inicializadores, métodos estáticos como accesores singleton y otros métodos que desean devolver una instancia de la clase receptora necesaria para devolver un id . El problema es que id significa "un objeto de cualquier tipo" . Por lo tanto, el compilador no puede detectar que NSString *wrong = [[Foo alloc] initWithString:@"abc"]; está asignando a una variable con un tipo incorrecto.

Debido a este problema, los inicializadores siempre deben usar instancetype lugar de id como valor de retorno.

Especificando genéricos

Puede mejorar sus propias clases con genéricos como NSArray o NSDictionary .

@interface MyClass<__covariant T>

@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;

- (void) addObject:(nonnull T)obj;

@end

Diferencia entre asignación e inicialización.

En la mayoría de los lenguajes orientados a objetos, asignar memoria a un objeto e inicializarlo es una operación atómica:

// Both allocates memory and calls the constructor
MyClass object = new MyClass();

En Objective-C, estas son operaciones separadas. Los métodos de clase alloc (y su histórico hermano allocWithZone: hacen que el tiempo de ejecución de Objective-C reserve la memoria requerida y la borre. Excepto por unos pocos valores internos, todas las propiedades y variables se establecen en 0 / NO / nil .

El objeto entonces ya es "válido", pero siempre queremos llamar a un método para configurar realmente el objeto, que llamamos un inicializador . Estos tienen el mismo propósito que los constructores en otros idiomas. Por convención, estos métodos comienzan con init . Desde el punto de vista del lenguaje, son solo métodos normales.

// Allocate memory and set all properties and variables to 0/NO/nil.
MyClass *object = [MyClass alloc];
// Initialize the object.
object = [object init];

// Shorthand:
object = [[MyClass alloc] init];


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow