Frage

Ich habe C-Stil Funktionen worden, aber ich habe gerade erfahren, können sie nicht Instanzvariablen sehen. So wurde ich geraten, sie zu Objective-C-Methoden zu konvertieren.

NSString* myfunc ( int x )

wird:

- (NSString *)myfunc:(int)x

und

myString = myfunc(x);

wird

myString = [myString myfunc:x];

??

Dies kompiliert mit ominösen Warnungen, aber nicht funktioniert. Was habe ich falsch verstanden?

War es hilfreich?

Lösung

Es sieht aus wie Ihr Anruf nicht korrekt ist. Vielleicht versuchen:

NSString *myString = [self myfunc:x];

Andere Tipps

Soweit ich verstehen, senden Sie die Nachricht an einen -myfunc: NSString-Objekt. So ist die -myfunc: Methode sollte in NSString Klasse deklariert werden (oder eine Kategorie von NSString).

Wenn das ist, was Sie tun möchten, brauchen Sie nicht das Objekt selbst als das Ergebnis der Methode zurückgeben: Sie seine Instanzvariablen in der Methode Implementierung ändern können. Der Methodenaufruf (oder eine Nachricht gesendet wird) wie folgt aussieht:

[myString myfunc:x];

Wenn Sie die Nachricht an ein Objekt einer anderen Klasse senden möchten, und geben eine Zeichenfolge, Ihre Methode Erklärung korrekt ist, aber in der Klasse Implementierung und dem Empfänger der Nachricht (dies ist der Punkt auf der linken Seite auf dem Platz erscheinen müssen Klammern) dieser Klasse müssen:

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

Als zweite Antwort, ich versuche, das Problem durch alle Ihre letzten Fragen zu verstehen.

Auf der Anfang gab es eine C-Funktion einen Zeiger auf ein Objekt NSString Rückkehr:

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

Dann , wollte man in dieser Funktion einen Code über ein UIImage Objekt hinzuzufügen:

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

Sie wurden angewiesen, die Funktion auf ein Verfahren zu konvertieren. Wenn Sie .image Instanzvariable zugreifen möchten, ist diese Methode zur Klasse der image1 Objekt gehören hat (sagen wir, dies ist AlanImage Klasse). So etwas wie folgt aus:

@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

Dritter , dass Sie nicht wissen, was der Empfänger des Verfahrens. Meine Untersuchungen sind in der Regel Ihre image Objekt als ein guter Kandidat führen:

aNiceString = [image myfunc:aNiceInteger];

Schließlich (diese Frage), keine befriedigende Antwort zu bekommen, umformuliert Sie Ihre dritte Frage, mit Erfolg diesmal, wie es geschieht.

Ich bin gespannt, um eine vollständigere Ansicht Ihres Projektes zu erhalten, um Ihnen einige Hinweise zu geben. Wie auch immer, es scheint, dass Sie Objective-C und objektorientierte Konzepte lernen: Glückwünsche und bleiben motiviert

Sie haben nicht geklappt, was Programming Object Oriented ist. Mit [theObject method] können Sie nur Methoden, um die spezifische Instanz gehören, nennen.

Ich bin nicht sicher, dass folgender Trick für ein „allgemeinen“ Objective-c richtig funktionieren, aber in Apfel Implementierung können Sie tun so:

@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

Ich benutze solchen Trick eine große objc Methode auf beobachtbaren privaten einfachen Funktionen zu teilen. Diese Funktionen (a) nicht verschmutzen Klassenschnittstelle und (b) wird aufgerufen, schneller als objc Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top