Métodos Obj-C: llamada con parámetros.
-
03-07-2019 - |
Pregunta
He estado usando funciones de estilo C, pero acabo de enterarme de que no pueden ver las variables de instancia. Así que me recomendaron convertirlos a métodos Objective-C.
NSString* myfunc ( int x )
se convierte en:
- (NSString *)myfunc:(int)x
y
myString = myfunc(x);
se convierte en
myString = [myString myfunc:x];
??
Esto compila con advertencias siniestras, pero no funciona. ¿Qué he entendido mal?
Solución
Parece que tu llamada es incorrecta. Tal vez intente:
NSString *myString = [self myfunc:x];
Otros consejos
Según tengo entendido, envía el mensaje -myfunc:
a un objeto NSString. Por lo tanto, el método -myfunc:
debe declararse en la clase NSString
(o en una categoría de NSString
).
Si esto es lo que quiere hacer, no necesita devolver el objeto como resultado del método: puede modificar sus variables de instancia en la implementación del método. El método de llamada (o envío de mensajes) se ve así:
[myString myfunc:x];
Si desea enviar el mensaje a un objeto de otra clase y devolver una cadena, su declaración de método es correcta pero debe aparecer en la implementación de su clase y en el destinatario del mensaje (este es el elemento a la izquierda en el cuadrado corchetes) deben ser de esa clase:
@implementation MyClass
-(NSString *)myfunc:(int)x
{
NSString * returnString;
...// do something with x, returnString and instance variables
return returnString;
}
@end;
...
MyClass * myobj = [[MyClass alloc] init];
NSString * myString = [myobj myfunc:42];
Como segunda respuesta, estoy tratando de entender su problema a través de todas sus preguntas recientes.
En el comenzando , había una función de C que devolvía un puntero a un NSString
objeto:
NSString * myfunc( int x )
{
... // Do something with x
NSString * myString = @"MYDATA";
... // Do something with myString
return myString;
}
Entonces , quería agregar en esa función algún código sobre un UIImage
objeto:
image1.image = [UIImage imageNamed:@"image1.png"];
Se te recomendó convertir la función a un método. Si desea acceder a la variable de instancia .image
, este método debe pertenecer a la clase del objeto image1
(digamos que es la clase AlanImage
) . Algo como esto:
@interface AlanImage : NSObject {
UIImage image;
}
- (NSString *) myfuncWithParam: (int) x;
@end;
@implementation AlanImage
- (NSString *) myfuncWithParam: (int) x
{
NSString * myString = @"MYDATA";
image = [UIImage imageNamed:@"image1.png"];
return myString;
}
@end
Tercer , no sabía qué era El receptor del método. Mis investigaciones tienden a llevar a su objeto image
como un buen candidato:
aNiceString = [image myfunc:aNiceInteger];
Finalmente (esta pregunta), al no obtener una respuesta satisfactoria, redactó nuevamente su tercera pregunta, con éxito esta vez a medida que sucede.
Tengo curiosidad por obtener una vista más completa de tu proyecto para darte algunos consejos. De todos modos, parece que estás aprendiendo Objective-C y conceptos orientados a objetos: ¡felicidades y mantente motivado!
No has descubierto lo que Programación Orientada a Objetos . Con [theObject method]
solo puede llamar a métodos que pertenecen a la instancia específica.
No estoy seguro de que el siguiente truco funcione correctamente para un " general " objetivo-c, pero en la implementación de Apple puede hacer lo siguiente:
@interface SomeClass: NSObject {
int m_someVariable;
...
};
- (NSString *) someMethod;
...
@end
@implementation SomeClass
...
//pure c function with extra one parameter
//for accessing to instance variables
static NSString privatePlainCeeMethod(SomeClass *my, int fortyTwo) {
NSString *str;
//access to a instance variable as for a usual
//cee structure field: my->fieldName
...
return [NSString stringWithFormat:@"someVariable:%d, fortyTwo:%d",
my->m_someVariable, fortyTwo];
};
- (NSString *) someMethod {
...
return privatePlainCeeMethod(self,42);
};
...
@end
Uso este truco para dividir un método de gran objc en funciones simples privadas observables. Estas funciones (a) no contaminan la interfaz de clase y (b) se invocan más rápido que el método objc.