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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top