Como transferir valores entre as classes no iPhone?
-
03-07-2019 - |
Pergunta
Eu quero enviar uma cadeia de uma classe para a outra:
1) Em class1, eu adicionar uma propriedade para armazenar o string:
@property (nonatomic, retain) NSString *str;
2) e um método para enviar de volta uma string:
-(NSString *)sendBackStr:(NSString *)strURL
{
NSString *str = [[NSString alloc] stringWithString:strURL];
return str;
}
3) Em class2, eu adicionar uma propriedade para segurar a corda recebidas:
@property (nonatomic, retain) NSString *returnStr;
4) e o seguinte código:
Class1 *c1 = [[Class1 alloc] init];
returnStr = [c1 sendBackStr:@"URL"];
Mas o programa pára em ReturnStr = [c1 sendBackStr: @ "URL"]; Todas as ideias sobre o que há de errado com ele?
Solução
stringWithString é um método de classe retornar uma string autoreleased. Você deve estar chamando-o assim:
myProperty = [NSString stringWithString:strURL];
Aqui eu assumir sua propriedade faz uma cópia, para incrementar a contagem na corda autoreleased que é retornado do método stringWithString reter. (Objetos retornados de chamadas Alloc ter um manter a contagem de um e não são autoreleased.) É mais usual para dar seqüências a propriedade cópia em vez do reter um - normalmente você apenas quer sua própria cópia de uma corda, e não uma referência compartilhada para uma string de propriedade de outra pessoa.
O que eu também não consigo entender é por que você escreveu o código como este, a menos que ele é apenas um exemplo. Na classe 2, tudo que você precisa fazer é escrever
returnStr = [NSString stringWithString:@"URL"];
Outras dicas
stringWithString:. É uma mensagem que deve ser enviado para a classe NSString, não uma instância de sua classe (retornado via alloc)
O código correto deve ser:
-(NSString *)sendBackStr:(NSString *)strURL
{
return [NSString stringWithString:strURL];
}
Você pode querer familarize-se mais sobre os idiomas ao redor de alocação, retenção e autoreleasing de ponteiros. Se você quisesse alloc esta cadeia por algum motivo e devolvê-lo a partir do sendBackStr: mensagem, então você provavelmente quer este código:
-(NSString *)sendBackStr:(NSString *)strURL
{
return [[[NSString alloc] initWithString:strURL] autorelease];
}