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?

È stato utile?

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];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top