2009-03-02 6 views
0

Ich möchte eine Zeichenfolge von einer Klasse zur anderen senden:Wie Werte zwischen Klassen auf dem iPhone übertragen werden?

1) In class1, habe ich eine Eigenschaft hinzufügen, um die Zeichenfolge zu halten:

@property (nonatomic, retain) NSString *str;

2) und ein Verfahren um eine Zeichenfolge zu senden zurück :


-(NSString *)sendBackStr:(NSString *)strURL 
{ 
    NSString *str = [[NSString alloc] stringWithString:strURL]; 
    return str; 
} 

3) In Klasse 2, füge ich eine Eigenschaft der empfangenen Zeichenfolge zu halten:

@property (nonatomic, retain) NSString *returnStr;

4) und der folgende Code ein:

Class1 *c1 = [[Class1 alloc] init]; 
returnStr = [c1 sendBackStr:@"URL"];

Aber das Programm hält an returnStr = [c1 sendBackStr: @ "URL"]; Irgendwelche Ideen darüber, was damit nicht stimmt?

Antwort

1

stringWithString eine Klassenmethode ist eine Autoreleased String zurück. Sie sollte es so sein Aufruf:

myProperty = [NSString stringWithString:strURL]; 

Hier nehme ich an Ihrer Immobilie eine Kopie der Fall ist, zu erhöhen, die Anzahl auf dem Autoreleased Zeichenfolge beibehalten, die von der stringWithString Methode zurückgegeben wird. (Objekte, die von Alloc-Aufrufen zurückgegeben werden, haben eine Retain-Anzahl von eins und sind nicht automatisch freigegeben.) Es ist üblicher, Strings die Copy-Eigenschaft als die Retain-Eigenschaft zu geben - normalerweise möchten Sie nur eine eigene Kopie einer Zeichenfolge und keinen gemeinsamen Verweis auf a Zeichenfolge, die jemand anderem gehört.

Was ich auch nicht verstehen kann ist, warum Sie den Code so geschrieben haben, es sei denn, es ist nur ein Beispiel. In der Klasse 2, alles, was Sie tun müssen, ist

schreiben
returnStr = [NSString stringWithString:@"URL"]; 
+0

Danke für Ihre Antwort. Und ja, das ist nur ein einfacher Test, den ich schreibe, um den Wert zu übertragen. –

1

stringWithString: ist eine Nachricht, die an die NSString-Klasse gesendet werden muss, keine Instanz Ihrer Klasse (die über Alloc zurückgegeben wird).

Das sollte korrekten Code sein:

-(NSString *)sendBackStr:(NSString *)strURL 
{ 
    return [NSString stringWithString:strURL]; 
} 

Sie könnten sich mehr über die Idiome der Zeiger um Zuweisung, Aufbewahrung und autoreleasing familarize wollen. Wenn Sie diese Zeichenfolge aus irgendeinem Grund Alloc wollte und senden Sie es aus der sendBackStr: Nachricht, dann würden Sie wahrscheinlich diesen Code:

-(NSString *)sendBackStr:(NSString *)strURL 
{ 
    return [[[NSString alloc] initWithString:strURL] autorelease]; 
} 
+0

Die alloc keine Instanz von „Klasse“ kehrt zurück - es ist [NSString alloc]. Aber stringWithString ist eine Klassenmethode. –