comment définir un retour NSString fonction Objective-C / Xcode en utilisant une variable temporaire?
Je voudrais définir la fonction suivante en Objective-C. j'ai fourni un pseudo-code pour aider à illustrer ce que je suis en train de faire.
PSEUDOCODE:
function Foo(param) {
string temp;
if(param == 1) then
temp = "x";
else if(param == 2) then
temp = "y";
else if(param == 3) then
temp = "z";
else
temp = "default";
end if
return temp;
}
Pour une raison quelconque, si je fais cela... la variable qui je l'attribuer à des résultats dans un "MAUVAIS Accès" erreur.
Je ne sais pas quelle est la différence entre:
static NSstring *xx;
ou la non-statique:
NSString *xx;
déclarations sont, et comment ou pourquoi je veux utiliser l'un sur l'autre.
J'ai aussi ne pas comprendre pleinement les initialiseurs de NSString, et comment ils diffèrent. Par exemple:
[[NSString alloc] initWithString:@"etc etc" ];
ou la simple affectation:
var = @""
ou encore:
var = [NSString stringWithString:@"etc etc"];
Pouvez-vous me donner un coup de main s'il vous plaît?
Jusqu'à présent, à l'aide de la NSString la valeur de retour de fonctions comme celles mentionnées ci-dessus, provoque toujours une erreur.
OriginalL'auteur PartySoft | 2011-03-20
Vous devez vous connecter pour publier un commentaire.
Qui déclare une allouée statiquement variable, un peu comme il le fait dans la C.
À l'intérieur d'une méthode qui déclare une normale de la pile locale variable, tout comme la C.
Que vous devez être conscient de la différence entre les deux est que la première sera de garder sa valeur entre les appels de la fonction (et peut causer des problèmes si la fonction est appelée à partir de plusieurs threads).
Qui crée un nouvel objet NSString, avec le contenu
etc etc
. Cela peut ou peut ne pas être le même que tout autre objet NSString dans votre programme avec le même contenu, mais vous n'avez pas de soins. Gestion de la mémoire de sage, vous en êtes propriétaire, vous êtes responsable de veiller à ce que finalement vous appelerrelease
ouautorelease
sur elle pour éviter des fuites de mémoire.Ceux qui sont fondamentalement les mêmes. Les deux de vous donner un NSString objet avec le contenu
etc etc
. Cela peut ou peut ne pas être le même que tout autre objet NSString dans votre programme avec le même contenu, mais vous n'avez pas de soins. Gestion de la mémoire de sage, vous ne possédez pas, donc vous devez pas appelrelease
ouautorelease
sur l'objet, sauf si vous prit d'abord la propriété en appelantretain
. Aussi, puisque vous ne possédez pas, vous pouvez l'utiliser dans votre méthode, passer en tant que paramètre à d'autres méthodes, et même l'utiliser comme valeur de retour à partir de votre méthode, mais vous ne pouvez pas stocker dans un ivar ou variable statique, sans la prise de possession par l'appel deretain
ou de faire une copie (aveccopy
).Notez également que
""
et@""
sont très différentes. Le premier vous donne unconst char *
exactement comme il le fait en C, tandis que le second vous donne un objet NSString. Votre programme sera bloquer si vous utilisez unconst char *
où le code s'attend à un objet NSString.OK donc en gros est préférable d'utiliser l'init, puis relâchez-droit? aussi, Mais ce qui se passe avec la mémoire après que cette zone mémoire? disons que je retourne un NSString avec une fonction init alloc que j'utilise la fonction quelque part, comme cette localement dans une fonction NSString *temp=[self myfunction];- (NSString *) mafonction { NSString *ret=[[NSString alloc] initWithString:@"etc etc"]; return ret; }
Pas nécessairement, d'utiliser celle qui est la plus appropriée à votre situation. Comme l'écrit, l'utilisateur de votre
myfunction
aurez à libérer la chaîne renvoyée ou de la mémoire sera coulé. À moins que le véritable nom de votremyfunction
commence avec les alloc, de nouvelles, de copier ou de mutableCopy, votre sémantique est mal: règles sont que des fonctions de ne pas commencer avec l'un de ces mots devrait retourner un autoreleased objet.OriginalL'auteur Anomie
Vous pouvez le faire de cette façon:
alors, quelle est la solution alors? vous avez raison..
faire une copie ou de conserver le résultat fera l'affaire
OriginalL'auteur Michal K.
Post de code réel, pas de pseudo-code, car elle rend beaucoup plus facile de répondre à votre question en des termes concrets.
Étant donné que vous indiquer que vous êtes tout à fait nouveau pour Objective-C, je suggère de commencer avec la guide de langue et puis de passer à l' guide de gestion de la mémoire.
OriginalL'auteur bbum