Come trasferire valori tra classi su iPhone?
-
03-07-2019 - |
Domanda
Voglio inviare una stringa da una classe all'altra:
1) In class1, aggiungo una proprietà per contenere la stringa:
@property (nonatomic, retain) NSString *str;
2) e un metodo per inviare una stringa:
-(NSString *)sendBackStr:(NSString *)strURL
{
NSString *str = [[NSString alloc] stringWithString:strURL];
return str;
}
3) In class2, aggiungo una proprietà per contenere la stringa ricevuta:
@property (nonatomic, retain) NSString *returnStr;
4) e il seguente codice:
Class1 *c1 = [[Class1 alloc] init];
returnStr = [c1 sendBackStr:@"URL"];
Ma il programma si ferma su returnStr = [c1 sendBackStr: @ " URL "]; Qualche idea su cosa c'è che non va?
Soluzione
stringWithString è un metodo di classe che restituisce una stringa rilasciata automaticamente. Dovresti chiamarlo così:
myProperty = [NSString stringWithString:strURL];
Qui presumo che la tua proprietà esegua una copia, per aumentare il conteggio di mantenimento sulla stringa rilasciata automaticamente che è stata restituita dal metodo stringWithString. (Gli oggetti restituiti dalle chiamate alloc hanno un conteggio di mantenimento di uno e non vengono rilasciati automaticamente.) È più normale assegnare alle stringhe la proprietà della copia piuttosto che quella di mantenimento - di solito si desidera solo la propria copia di una stringa, non un riferimento condiviso a un stringa di proprietà di qualcun altro.
Quello che non capisco è anche perché hai scritto il codice in questo modo, a meno che non sia solo un esempio. Nella classe 2, tutto ciò che devi fare è scrivere
returnStr = [NSString stringWithString:@"URL"];
Altri suggerimenti
stringWithString: è un messaggio che deve essere inviato alla classe NSString, non un'istanza della classe (restituita tramite alloc).
Il codice corretto dovrebbe essere:
-(NSString *)sendBackStr:(NSString *)strURL
{
return [NSString stringWithString:strURL];
}
Potresti voler familiarizzare di più sui modi di dire dell'assegnazione, della conservazione e del rilascio automatico dei puntatori. Se si desidera allocare questa stringa per qualche motivo e restituirla dal messaggio sendBackStr:, probabilmente si vorrebbe questo codice:
-(NSString *)sendBackStr:(NSString *)strURL
{
return [[[NSString alloc] initWithString:strURL] autorelease];
}