+ – qual é o objective?

Como as strings NSString são imutáveis, qual é o valor do método stringWithString: class?

Eu recebo o utilitário quando usado com NSMutableString , eu só não vi o utilitário com a class NSString .

Você pode ter uma NSMutableString (ou alguma subclass de NSString desenvolvida internamente) que deseja duplicar.

 NSMutableString *buffer = [NSMutableString string]; // do something with buffer NSString *immutableStringToKeepAround = [NSString stringWithString:buffer]; 

Claro, você também pode fazer uma cópia:

 NSMutableString *buffer = [NSMutableString string]; // do something with buffer NSString *immutableStringToKeepAround = [[buffer copy] autorelease]; 

mas você possui a cópia e deve liberar ou autorelease-lo.

Como “Andy” aponta em # 318666, está relacionado ao gerenciamento de memory, citando:

A diferença entre initWithString e stringWithString é que stringWithString retorna um ponteiro lançado automaticamente. Isso significa que você não precisa liberá-lo especificamente, pois isso será feito da próxima vez que o pool de liberação automática limpar todos os pointers liberados automaticamente.

initWithString, por outro lado, retorna um ponteiro com uma contagem de retenções de 1 – você precisa chamar release nesse ponteiro, senão isso resultaria em um memory leaks.

(Tirado daqui )

Retorna uma string criada copiando os caracteres de outra string dada

 [NSString stringWithString:@"some string"] 

É equivalente a

 [[[NSString alloc] initWithString:@"some string"] autorelease] 

Além disso, se você tiver um ponteiro para um NSString, ele pode, na verdade, ser uma subclass de NSString, como NSMutableString. Portanto, se você quiser armazenar a string e garantir que ela não seja alterada, faça uma cópia dela, portanto, stringWithString existe.

Como outro caso de uso, se (por qualquer motivo) você criar sua própria subclass de NSString ou NSMutableString, stringWithString: fornece uma maneira prática de instanciá-la com uma instância de NSString, NSMutableString ou MyCustomString.

Costumo usar +stringWithString: quando eu preciso criar um NSMutableString mas iniciá-lo com um valor inicial. Por exemplo:

 NSMutableString * output = [NSMutableString stringWithString:@"
    "]; for (NSString * item in anArray) { [output appendFormat:@"
  • %@
  • ", item]; } [output appendString:@"
"];

FYI, agora que estamos compilando com o ARC habilitado, você não precisa liberar manualmente, o ARC inserirá as chamadas de liberação durante o tempo de compilation. Então, como ainda é diferente? stringWithString ainda é adicionado ao pool autorelease que é drenado em algum momento no futuro (a menos que você tenha criado seu próprio pool autorelease). O initWithString terá uma chamada de liberação logo antes que a function termine, portanto, se você não a reteve em algum lugar do método, pode ter certeza de que a string é destruída até o final da chamada de function. Isso lhe dá um controle mais rigoroso sobre o gerenciamento de memory, em oposição ao uso de objects autoreleased.