Question

J'utilise des fonctions de style C, mais je viens d'apprendre qu'elles ne peuvent pas voir les variables d'instance. On m'a donc conseillé de les convertir aux méthodes Objective-C.

NSString* myfunc ( int x )

devient:

- (NSString *)myfunc:(int)x

et

myString = myfunc(x);

devient

myString = [myString myfunc:x];

??

Ceci compile avec des avertissements inquiétants, mais ne fonctionne pas. Qu'ai-je mal compris?

Était-ce utile?

La solution

Il semble que votre appel soit incorrect. Peut-être essayez-vous:

NSString *myString = [self myfunc:x];

Autres conseils

Pour autant que je sache, vous envoyez le message -myfunc: à un objet NSString. La méthode -myfunc: doit donc être déclarée dans la classe NSString (ou une catégorie de NSString ).

Si c'est ce que vous voulez faire, vous n'avez pas besoin de renvoyer l'objet lui-même en tant que résultat de la méthode: vous pouvez modifier ses variables d'instance dans l'implémentation de la méthode. L’appel à la méthode (ou l’envoi du message) se présente comme suit:

[myString myfunc:x];

Si vous souhaitez envoyer le message à un objet d'une autre classe et renvoyer une chaîne, la déclaration de votre méthode est correcte mais doit figurer dans l'implémentation de votre classe et dans le destinataire du message (il s'agit de l'élément de gauche dans le carré entre parenthèses) doit être de cette classe:

@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];

Comme deuxième réponse, j'essaie de comprendre votre problème à travers toutes vos questions récentes.

Au début , une fonction C renvoyait un pointeur sur un NSString objet:

NSString * myfunc( int x )
{
           ... // Do something with x
   NSString * myString = @"MYDATA";
           ... // Do something with myString
   return myString;        
}

Ensuite , vous vouliez ajouter à cette fonction du code concernant un UIImage. objet:

image1.image = [UIImage imageNamed:@"image1.png"];

Il vous a été conseillé de convertir la fonction en méthode. Si vous souhaitez accéder à la variable d'instance .image , cette méthode doit appartenir à la classe d'objet image1 (disons qu'il s'agit de la classe AlanImage ). . Quelque chose comme ça:

@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

Troisième , vous ne saviez pas ce que c'était le destinataire de la méthode. Mes investigations tendent à faire de votre objet image un bon candidat:

aNiceString = [image myfunc:aNiceInteger];

Enfin (cette question), sans réponse satisfaisante, vous avez reformulé votre troisième question, avec le succès obtenu cette fois-ci.

Je suis curieux d’obtenir une vue plus complète de votre projet afin de vous donner des indices. Quoi qu'il en soit, il semble que vous appreniez les concepts Objective-C et orientés objet: félicitations et motivation!

Vous n'avez pas défini ce qu'est la Programmation orientée objet . Avec [la méthode Object] , vous ne pouvez appeler que des méthodes appartenant à l'instance spécifique.

Je ne suis pas sûr que le tour suivant fonctionne correctement pour un "général". objective-c, mais dans l'implémentation Apple, vous pouvez le faire:

@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

J'utilise une telle astuce pour diviser une grande méthode objc en fonctions simples observables privées. Ces fonctions (a) ne polluent pas l’interface de classe et (b) sont invoquées plus rapidement que la méthode objc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top