¿Cuál es la diferencia entre los métodos de clase y de instancia?

¿Cuál es la diferencia entre un método de clase y un método de instancia?

¿Los métodos de instancia son los accessors (getters y setters) mientras que los métodos de clase son prácticamente todo lo demás?

Como han dicho la mayoría de las otras respuestas, los métodos de instancia usan una instancia de una clase, mientras que un método de clase se puede usar solo con el nombre de clase. En Objective-C se definen de la siguiente manera:

@interface MyClass : NSObject + (void)aClassMethod; - (void)anInstanceMethod; @end 

Entonces podrían ser usados ​​así:

 [MyClass aClassMethod]; MyClass *object = [[MyClass alloc] init]; [object anInstanceMethod]; 

Algunos ejemplos del mundo real de los métodos de clase son los métodos de conveniencia en muchas clases de Foundation como NSString ‘s +stringWithFormat: o NSArray ‘ s +arrayWithArray: Un método de instancia sería el método de NSArray ‘s -count .

Todos los detalles técnicos han sido bien cubiertos en las otras respuestas. Solo quiero compartir una simple analogía que creo que ilustra muy bien la diferencia entre una clase y una instancia:

enter image description here

Una clase es como el plano de una casa: solo tienes un plano y (por lo general) no puedes hacer tanto con el plano solo.

enter image description here

Una instancia (o un objeto ) es la casa real que construyes según el modelo: puedes construir muchas casas a partir del mismo modelo. Luego puede pintar las paredes con un color diferente en cada una de las casas, del mismo modo que puede cambiar independientemente las propiedades de cada instancia de una clase sin afectar las otras instancias.

Al igual que las otras respuestas, los métodos de instancia operan en un objeto y tienen acceso a sus variables de instancia, mientras que un método de clase opera en una clase como un todo y no tiene acceso a las variables de una instancia particular (a menos que pase la instancia como un parámetro).

Un buen ejemplo de un método de clase es un método de tipo contador, que devuelve el número total de instancias de una clase. Los métodos de clase comienzan con a + , mientras que los de instancia comienzan con un - . Por ejemplo:

 static int numberOfPeople = 0; @interface MNPerson : NSObject { int age; //instance variable } + (int)population; //class method. Returns how many people have been made. - (id)init; //instance. Constructs object, increments numberOfPeople by one. - (int)age; //instance. returns the person age @end @implementation MNPerson - (id)init{ if (self = [super init]){ numberOfPeople++; age = 0; } return self; } + (int)population{ return numberOfPeople; } - (int)age{ return age; } @end 

main.m:

 MNPerson *micmoo = [[MNPerson alloc] init]; MNPerson *jon = [[MNPerson alloc] init]; NSLog(@"Age: %d",[micmoo age]); NSLog(@"%Number Of people: %d",[MNPerson population]); 

Salida: Edad: 0 Cantidad de personas: 2

Otro ejemplo es si tiene un método que desea que el usuario pueda llamar, a veces es bueno hacer que ese sea un método de clase. Por ejemplo, si tiene una clase llamada MathFunctions, puede hacer esto:

 + (int)square:(int)num{ return num * num; } 

Entonces, el usuario llamaría:

 [MathFunctions square:34]; 

¡sin tener que crear una instancia de la clase!

También puede usar funciones de clase para devolver objetos liberados automáticamente, como NSArray’s

 + (NSArray *)arrayWithObject:(id)object 

Eso toma un objeto, lo pone en una matriz y devuelve una versión de la matriz que no se ha lanzado automáticamente y que no tiene que administrarse en memoria, ideal para arreglos temporales y lo que no.

¡Espero que ahora entiendas cuándo y / o por qué deberías usar los métodos de clase!

Un método de instancia se aplica a una instancia de la clase (es decir, un objeto) mientras que un método de clase se aplica a la clase misma.

En C #, un método de clase está marcado como estático. Los métodos y propiedades que no están marcados como estáticos son métodos de instancia.

 class Foo { public static void ClassMethod() { ... } public void InstanceMethod() { ... } } 

Creo que la mejor manera de entender esto es mirar alloc e init . Fue esta explicación la que me permitió entender las diferencias.

Método de clase

Un método de clase se aplica a la clase como un todo. Si comprueba el método alloc , ese es un método de clase denotado por la statement + antes del método. Es un método de clase porque se aplica a la clase para crear una instancia específica de esa clase.

Método de instancia

Utiliza un método de instancia para modificar una instancia específica de una clase que es única para esa instancia, en lugar de para la clase como un todo. init por ejemplo (denotado con a - antes de la statement del método), es un método de instancia porque normalmente se modifican las propiedades de esa clase una vez que se ha creado con alloc .

Ejemplo

 NSString *myString = [NSString alloc]; 

Está llamando al método de clase alloc para generar una instancia de esa clase. Observe cómo el receptor del mensaje es una clase.

 [myString initWithFormat:@"Hope this answer helps someone"]; 

Está modificando la instancia de NSString llamada myString configurando algunas propiedades en esa instancia. Observe cómo el receptor del mensaje es una instancia (objeto de clase NSString ).

La respuesta a su pregunta no es específica del objective-c, sin embargo, en diferentes idiomas, los métodos de clase se pueden llamar métodos estáticos.

La diferencia entre los métodos de clase y los métodos de instancia son

Métodos de clase

  • Operar en variables de clase (no pueden acceder a variables de instancia)
  • No requiere que un objeto sea instanciado para ser aplicado
  • A veces puede ser un olor codificado (algunas personas que son nuevas en OOP usan como una muleta para hacer una Progtwigción Estructurada en un entorno OO)

Métodos de instancia

  • Operar en variables de instancias y variables de clase
  • Debe tener un objeto instanciado para operar

Los métodos de clase generalmente se utilizan para crear instancias de esa clase

Por ejemplo, [NSString stringWithFormat:@"SomeParameter"]; devuelve una instancia de NSString con el parámetro que se le envía. Por lo tanto, dado que es un método de clase que devuelve un objeto de su tipo, también se lo denomina método de conveniencia.

Entonces si lo entiendo correctamente

Un método de class no necesita que usted asigne la instancia de ese objeto para usarlo / procesarlo. Un método de class es autónomo y puede operar sin dependencia del estado de cualquier objeto de esa clase. Se espera que un método de class asigne memoria para todo su propio trabajo y desasigne cuando esté terminado, ya que ninguna instancia de esa clase podrá liberar la memoria asignada en llamadas anteriores al método de clase.

Un método de instance es todo lo contrario. No puede llamarlo a menos que asigne una instancia de esa clase. Es como una clase normal que tiene un constructor y puede tener un destructor (que limpia toda la memoria asignada).

Lo más probable es que (a menos que esté escribiendo una biblioteca reutilizable, no necesite una variable de class .

Los métodos de instancia operan en instancias de clases (es decir, “objetos”). Los métodos de clase están asociados con las clases (la mayoría de los idiomas usan la palabra clave static para estos tipos).

Tomemos, por ejemplo, un juego donde se generan muchos autos. Cada uno pertenece a la clase CCar. Cuando se crea una instancia de un automóvil, hace una llamada a

 [CCar registerCar:self] 

Entonces, la clase CCar puede hacer una lista de cada CCar instanciado. Supongamos que el usuario finaliza un nivel y desea eliminar todos los automóviles … puede: 1- Ir a través de una lista de cada CCar que creó manualmente, y hacer whicheverCar.remove(); que whicheverCar.remove(); Car.remove whicheverCar.remove(); o 2- Agregue un método removeAllCars a CCar, que lo hará por usted cuando llame [CCar removeAllCars]. Es decir, allCars[n].remove();

O, por ejemplo, permite que el usuario especifique un tamaño de fuente predeterminado para toda la aplicación, que se carga y guarda al inicio. Sin el método de clase, es posible que tenga que hacer algo como

 fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize(); 

Con el método de clase, podrías salirte con [FontHandler getDefaultFontSize] .

En cuanto a su función removeVowels, encontrará que los lenguajes como C # en realidad tienen ambos con ciertos métodos, como toLower o toUpper.

por ejemplo, myString.removeVowels() y String.removeVowels(myString) (en ObjC que sería [String removeVowels:myString] ).

En este caso, la instancia probablemente llama al método de clase, por lo que ambos están disponibles. es decir

 public function toLower():String{ return String.toLower(); } public static function toLower( String inString):String{ //do stuff to string.. return newString; } 

básicamente, myString.toLower() llama a [String toLower:ownValue]

No hay una respuesta definitiva, pero si te apetece empujar un método de clase para mejorar tu código, pruébalo y ten en cuenta que un método de clase solo te permitirá utilizar otros métodos / variables de clase.

métodos de clase

son métodos que se declaran como estáticos. El método se puede llamar sin crear una instancia de la clase. Los métodos de clase solo pueden operar en los miembros de la clase y no en los miembros de la instancia, ya que los métodos de clase no son conscientes de los miembros de la instancia. Los métodos de instancia de la clase tampoco pueden invocarse desde un método de clase a menos que se invoquen a una instancia de esa clase.

Métodos de instancia

por otro lado requieren una instancia de la clase para existir antes de que puedan ser llamados, por lo que una instancia de una clase necesita ser creada usando la nueva palabra clave. Los métodos de instancia operan en instancias específicas de clases. Los métodos de instancia no se declaran como estáticos.

En Objective-C, todos los métodos comienzan con un carácter “-” o “+”. Ejemplo:

 @interface MyClass : NSObject // instance method - (void) instanceMethod; + (void) classMethod; @end 

Los caracteres “+” y “-” especifican si un método es un class method o un instance method respectivamente.

La diferencia sería clara si llamamos a estos métodos. Aquí los métodos se declaran en MyClass .

instance method requiere una instancia de la clase:

 MyClass* myClass = [[MyClass alloc] init]; [myClass instanceMethod]; 

Dentro de MyClass otros métodos pueden invocar métodos de instancia de MyClass usando self :

 -(void) someMethod { [self instanceMethod]; } 

Pero, class methods deben invocarse en la clase misma:

 [MyClass classMethod]; 

O:

 MyClass* myClass = [[MyClass alloc] init]; [myClass class] classMethod]; 

Esto no funcionará:

 // Error [myClass classMethod]; // Error [self classMethod]; 

MÉTODOS DE CLASE


Un método de clase generalmente crea una nueva instancia de la clase o recupera algunas propiedades globales de la clase. Los métodos de clase no operan en una instancia o tienen acceso a la variable de instancia.


MÉTODOS DE INSTANCIA


Un método de instancia opera en una instancia particular de la clase. Por ejemplo, el método de acceso que implementó son todos métodos de instancia. Los usas para establecer u obtener las variables de instancia de un objeto en particular.


INVOCAR


Para invocar un método de instancia, envía el mensaje a una instancia de la clase.

Para invocar un método de clase, envía el mensaje directamente a la clase.


Fuente: IOS – Objective-C – Métodos de clase y métodos de instancia

Los métodos de clase no pueden cambiar ni conocer el valor de ninguna variable de instancia. Ese debería ser el criterio para saber si un método de instancia puede ser un método de clase.

También recuerde, la misma idea se aplica a las variables. Encontrará términos como estático, miembro, instancia, clase, etc. cuando se trate de variables de la misma manera que lo haría con los métodos / funciones.

Parece que el término común en la comunidad Obj-C es ivar, por ejemplo, variable, pero todavía no soy un tipo Obj-C.

Una actualización de las respuestas anteriores, acepto que los métodos de instancia usan una instancia de una clase, mientras que un método de clase se puede usar solo con el nombre de clase.

Ya no hay ninguna diferencia entre el método de instancia y el método de clase después de que el recuento automático de referencias llegó a existir en Objective-C.

Por ejemplo [NS StringWithformat:..] un método de clase & [[NSString alloc] initwihtformat:..] un método de instancia, ambos son iguales después de ARC

Nota: Esto es solo en formato de pseudo código

Método de clase

Casi todo lo que necesita hacer es durante el tiempo de comstackción . No necesita ninguna entrada de usuario, ni el cálculo de la misma se basa en una instancia. Todo se basa en la clase / blueprint, que es único, es decir, no tienes múltiples planos para una clase. ¿Puedes tener diferentes variaciones durante el tiempo de comstackción? No, por lo tanto, la clase es única y, por lo tanto, no importa cuántas veces llame a un método de clase, el puntero que apunta a él será el mismo.

 PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes. 

Método de instancia

Por el contrario, el método de instancia ocurre durante el tiempo de ejecución, ya que es solo entonces que ha creado una instancia de algo que podría variar en cada instanciación.

 initWithName: @"John" lastName: @"Doe"Age:12 @"cool" initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started" initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome" //As you can see the value can change for each instance. 

Si vienes de otros idiomas Los métodos estáticos son los mismos que los métodos de clase.
Si vienes de Swift, los métodos tipo son los mismos que los métodos de clase.

Agregando a las respuestas anteriores

El método de clase funcionará en la clase, usaremos esto para propósitos generales donde like + stringWithFormat, tamaño de clase y lo más importante para init, etc.

NSString * str = [NSString stringWithFormat: @ “%. 02f %%”, someFloat];

El Método de instancia funcionará en una instancia de una clase que no esté en una clase como si tuviéramos dos personas y queremos conocer el equilibrio de cada una de ellas por separado. Aquí necesitamos usar el método de instancia. Porque no devolverá una respuesta general. por ejemplo, como determinar el recuento de NSSArray, etc.

[johnson getAccountBalance];

[ankit getAccountBalance];