2009-07-22 7 views
3

Je dois construire une NSString qui ressemble à ce qui suit:dynamique, NSString localisé

Nom: Craig Buchanan
Téléphone: 800-555-1212 Courriel
: [email protected]

Où :

  • chaque ligne (par exemple, téléphone) est inclus ou exclu en fonction de la valeur d'un UISwitch
  • la partie de touche de la chaîne (c.-à-d. la partie à gauche de ':') est localisée
  • la partie valeur provient d'un objet UITextField.

Mon approche:

NSMutableArray *values = [[NSMutableArray alloc] initWithCapacity:3]; 

if (self.nameSwitch.isOn) 
    [values addObject:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Name", @"Name label"), textFieldName.text]]; 
if (self.telephoneSwitch.isOn) 
    [values addObject:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Telephone", @"Telephone number label"), textFieldTelephone.text]]; 
if (self.emailSwitch.isOn) 
    [values addObject:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Email", @"Email address label"), textFieldEmail.text]]; 

return [values componentsJoinedByString:@"\r"]; 

J'ai quelques questions:

  • Est-ce une approche correcte (je suis un Noob objective-c)?
  • Je me rends compte que mon tableau est autoeleased, mais je suis toujours préoccupé par l'utilisation de la mémoire. devrais-je libérer le pool de libérations automatiques? semble un peu dangereux. Je souhaite rendre le code un peu plus dynamique. ma pensée initiale est de créer un tableau de variables de sortie, puis utiliser la balise UISwitch pour stocker la clé qui conduit la localisation. pensées?

Merci pour votre temps,

Craig Buchanan

Répondre

1

Votre langue cible pourrait ne pas utiliser côlons, donc il suffit de faire des appels comme celui-ci pour ajouter les lignes localisées:

[values addObject:[NSString stringWithFormat:NSLocalizedString(@"Name: %@", @"Name line"), name]; 

En ce qui concerne la question autorelease, vous pouvez faire un pool d'autorelease locale:

NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
// Do stuff. 
[myPool release]; 

Enfin, vous pouvez utiliser la balise du commutateur pour indiquer un index de tableau. Si vous faites cela, vous n'aurez même pas besoin d'une variable IBOutlet pour le commutateur; vous pouvez simplement utiliser -viewForTag: ou l'argument de la méthode d'action. Vous pouvez utiliser NSIndexSet pour stocker l'état du commutateur si vous le souhaitez. Mais si vous voulez être dynamique, vous devriez probablement utiliser une table pour maintenir les commutateurs. Si vous faites cela, vous pouvez utiliser le numéro de ligne de la table au lieu d'une étiquette.

+0

Je suppose que les variables locales d'autorelease sont automatiquement affectées à un pool de libération automatique créé localement, correct? Est-ce que vous vous trouvez en utilisant cela fréquemment? Si je comprends votre dernière suggestion, j'aurais une variable NSIndexSet au niveau de l'instance qui serait modifiée sur la méthode IBAction qui est assignée aux UISwitches? Cette variable serait utilisée dans une boucle for par la méthode qui crée la chaîne dynamique pour piloter le processus de localisation. Vrai? Merci. – craig

+0

La réponse est "oui" à tout ce que vous avez dit, sauf que je n'utilise pas fréquemment les pools d'autorelease locaux, car j'utilise généralement le pattern alloc/init dans des boucles serrées. –