iOS para desarrolladores .NET: Clases en Objetive-C parte 3

jueves, 5 de febrero de 2015


En el anterior artículo vimos como se definen los inicilizadores en una clase y los tipo de inicilizadores que existen.

En este artículo vamos a ver los métodos, como se definen y que tipo de métodos tenemos.

Métodos de clase

Métodos de clase son métodos que no necesitan de una instancia de objeto para poder invocarse, el concepto es igual a los métodos estáticos de C#.

C#

En C# existe el modificador static para indica que un método es de clase.

public class Builder
{
    public static Product BuildProduct (string name)
    {
        return new Product(name);
    }
}


Y se invoca directamente desde la clase.

Product product = Builder.BuildProduct("ejemplo ejemplo");

Objetive-C

En Objetive-C existe el signo + para indicar cuando un método es de clase

//Fichero de cabecera
@interface Builder : NSObject
  +(id)buildProductWithName(NSString *) name;
@end

//Fichero de implementación
@implementation Builder
    +(id)buildProductWithName(NSString *) name{
        
        return [Product alloc[ initWithName:name]];

    }


Fijaros que la sintáxis de los métodos es igual que la de los inicializadores que vimos en el anterior artículo. Los parámetros aparecen intercalados en el nombre del método y este nombre tiene que hacer referencia a todos los parámetros.

Y se invoca directamente desde la clase.

Product product = [Builder buildProductWithName:@"ejemplo ejemplo"];

Métodos de instancia

Métodos de instancia son métodos que necesitan de una instancia de la clase, es decir, se invocan sobre el objeto no sobre la clase, el concepto es igual a los métodos normales de un objeto en C#.

C#

En C# si no ponemos el modificador static por defecto es un método de instancia.

public class Product
{
    public void ChangeName (string name)
    {
        Name = name;
    }
}


Y se invoca a través de una instancia.

Product product = Builder.BuildProduct("ejemplo ejemplo");

product.ChangeName("ejemplo 2");

Objetive-C

En Objetive-C existe el signo - para indicar cuando un método es de instancia.

//Fichero de cabecera
@interface Product : NSObject
  -(void)changeName(NSString *) name;
@end

//Fichero de implementación
@implementation Product
    -(void)changeName(NSString *) name{
        
        _name = name;

    }
@end  


Y se invoca a través de una instancia.

Product product = [Builder buildProductWithName:@"ejemplo ejemplo"];

[product changeName:@"ejemplo 2"];

Métodos de factoría

Como ya hemos visto existen en Objetive-C inicializadores para crear instancias de una clase, el concepto es parecido a los constructores de C#. Sin embargo es habitual utilizar métodos de clase como métodos de factoría.

En el framework cocoa existen muchos ejemplos de clases que contienen métodos de factoría, la convención es que comience por el nombre de clase sin ningun prefijo.
//métodos de factoria de la clase NSDate
+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;

//métodos defactoría de la clase NSData 
+ (id)dataWithBytes:(const void *)bytes length:(unsigned)length;
+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length;
+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length
        freeWhenDone:(BOOL)b;
+ (id)dataWithContentsOfFile:(NSString *)path;
+ (id)dataWithContentsOfURL:(NSURL *)url;
+ (id)dataWithContentsOfMappedFile:(NSString *)path;

//métodos de factoria de la clase NSString
+ (id)string;
+ (id)stringWithString:(NSString *)aString;
+ (id)stringWithFormat:(NSString *)format, …;
+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc;

Resumen

En este artículo hemos visto los tipos de métodos que existen en Objetive-C como son de instancia y de clase. También hemos visto como podémos utilizar los métodos de clase para tener métodos de factoría que nos pueden servir para crear un objeto encapsulando así los dos pasos de alloc y de inicilización

Libros relacionados

iOs Programming for .Net Developers

iOS Programming: The Big Nerd Ranch Guide

Objective-C Programming: The Big Nerd Ranch Guide

No hay comentarios:

Publicar un comentario