2009-03-03 18 views
2

Ich habe C-Stil-Funktionen verwendet, aber ich habe gerade gelernt, dass sie keine Instanzvariablen sehen können. Daher wurde mir geraten, sie in Objective-C-Methoden umzuwandeln.Obj-C Methoden: Aufruf mit Parametern

NSString* myfunc (int x) 

wird:

- (NSString *)myfunc:(int)x 

und

myString = myfunc(x); 

wird

myString = [myString myfunc:x]; 

??

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

+0

Haben Sie diese Frage nicht schon gestellt? http://stackoverflow.com/questions/607528/calling-a-obj-c-metho-with-a-parameter – Chuck

Antwort

2

Es sieht aus wie Ihr Anruf falsch ist. Vielleicht versuchen:

NSString *myString = [self myfunc:x]; 
+0

[self myfunc: x] funktioniert! Vielen Dank! – Alan

0

Sie haben nicht geklappt, was Object Oriented Programming ist. Mit [theObject method] können Sie nur Methoden aufrufen, die zu der bestimmten Instanz gehören.

+0

Nun, das ist wahr :) --- Ich versuche aber zu lernen. – Alan

1

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

Wenn dies der Fall ist, müssen Sie das Objekt selbst nicht als Ergebnis der Methode zurückgeben: Sie können seine Instanzvariablen in der Methodenimplementierung ändern. Der Methodenaufruf sieht aus wie (oder eine Nachricht zu senden):

[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 erscheinen müssen und die Empfänger der Nachricht (dies ist der Punkt auf der linke Seite in den eckigen Klammern) muss diese Klasse sein:

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

ich bin nicht sicher, dass folgender Trick richtig für ein „allgemeines“ arbeitet Objective-c, aber in Apple-Implementierung können Sie tun:

@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 einen solchen Trick, um eine große Objc-Methode auf beobachtbare private einfache Funktionen zu teilen. Diese Funktionen (a) verschmutzen nicht die Klassenschnittstelle und (b) werden schneller als die objc-Methode aufgerufen.

1

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

Am beginning gibt es eine C-Funktion war es, einen Zeiger auf ein NSString Objekt Rückkehr:

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

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

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

Es wurde empfohlen, die Funktion in eine Methode zu konvertieren.Wenn Sie auf die Instanzvariable .image zugreifen möchten, muss diese Methode zur Klasse image1 Objekt gehören (sagen wir AlanImage Klasse). 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 

Third, Sie wusste nicht, was der Empfänger des Verfahrens war. 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, Sie umformuliert Ihre dritte Frage, mit Erfolg diesmal, wie es geschieht.

Ich bin neugierig auf eine umfassendere Ansicht Ihres Projekts, um Ihnen einige Hinweise zu geben. Wie auch immer, es scheint, dass Sie Objective-C und objektorientierte Konzepte lernen: Herzlichen Glückwunsch und bleiben Sie motiviert!

Verwandte Themen