9
votes

StringByAppingerPathcomponent, comment ça marche?

EDIT_V002

J'ai un coup d'œil à tous les commentaires et je commence à voir ce que je devrais faire. À cette fin, j'ai modifié mon code (voir ci-dessous) J'ai changé de nouveauPath vers un Nstring, supprimé la [[Alloc] init] et la fin [version] comme étant traitée maintenant par le système. J'utilise StringByAppingerPathcomponent, le permettant d'ajouter un séparateur entre rootpath et nom de fichier avant que celui attribué à la Nstring. Cela fonctionne et je le faisais dans l'analyseur statique sans problèmes. xxx

gary


0 commentaires

6 Réponses :


0
votes
[testPath stringByAppendingString:@"/"]

0 commentaires

5
votes

Vous n'ajoutez pas le délimiteur. Vous appendez le composant de chemin suivant (par exemple, nom de fichier, dir, etc.). Cela évite que vous ayez besoin de connaître le délimiteur pour votre système particulier.

NSMutableString* mutablePath = [NSMutableString string];
NSString* fullPath = [rootPath stringByAppendingPathComponent:filename];

[mutablePath setString:fullPath]; // OK to setString: of Mutable with non-Mutable
[mutablePath appendString:someOtherString]; // This won't cause an exception

// Example to clarify on comments below
{
    // This will cause a compiler warning.
    // warning: incompatible Objective-C types assigning
    //    ‘struct NSString *’, expected ‘struct NSMutableString *’
    NSMutableString* ms = [@"FOO" stringByAppendingPathComponent:@"BAR"];
}


4 commentaires

[TestPath SetString: [@ "Test_" StringByAppingerPathcomponent: @ "/"]]]; Juste curieux, TestPath est NsmutableString, cela fonctionne-t-il dans cette situation?


Juste curieux, si quelque chose retourne un nstring et que vous l'attribuez à une nsmutableString, je suppose que ça va?


Si vous faites cela, essayez de modifier la chaîne, vous obtiendrez une exception, car la chaîne immuable ne répondra pas au sélecteur de NsmutableString.


J'ai ajouté du code et des commentaires ci-dessus pour essayer de rendre cela plus clair.



1
votes

La dernière ligne devrait être:

testPath = [testPath stringByAppendingPathComponent:@"/"];


2 commentaires

Cela allait tourner testpath dans un nstring quand il a été déclaré et attribué sous forme de chaîne mutable.


De plus, la chaîne d'origine TESTPATH ​​ est maintenant divulguée, car elle n'était pas autoritée.



2
votes

-StringByAppendingPathComponent renvoie une nouvelle chaîne immuable, elle ne modifie pas l'original. Vous devez utiliser la valeur de retour de cette méthode.


0 commentaires

5
votes

Toutes les réponses existantes qui fuient la chaîne d'origine testpath code>. Pour quelque chose d'aussi simple que cela, pourquoi personne n'a recommandé - [NSMutableString appendentre:] code> intead? XXX PRE>

Il n'y a pas équivalent à -StringByAppingerPathcomponent: code> pour NsmutableString, mais il semble qu'il cherche simplement à ajouter une barre oblique, pas un composant de chemin de chemin. Si vous vouliez vraiment ajouter un composant chemin, vous pouvez le faire: P>

[testPath setString:[testPath stringByAppendingPathComponent:@"..."]];


5 commentaires

NsmutableString est un nstring et a donc StringByAppinkPomponComponce.


Je comprends cela, mais cela renvoie toujours une nouvelle chaîne automatique, plutôt que de modifier le contenu de la chaîne mutable, car on pourrait s'attendre à une méthode appelée -appendPathComponent: .


Il semble que c'est le moyen le plus simple d'obtenir ce que l'adresseur d'origine souhaitait et que le résultat soit toujours un nsmutableString.


J'ai suggéré StringByAppendingstring Way Retour


Vous avez fait, mais sans stocker le résultat à une variable, cela ne résout pas complètement le problème de l'OP, qui était que le testpath n'a pas été modifié. Dans l'ensemble, -StringByAppendingstring: n'est pas une bonne solution pour une chaîne mutable.



15
votes

StringByAppingerPathcomponent, comment ça marche? P>

simple. Vous voulez ajouter un composant de chemin. Vous envoyez ce message à la chaîne que vous souhaitez ajouter un composant chemin de chemin pour, en passant le composant de chemin que vous souhaitez ajouter. P>

Les composants du chemin ne sont pas les barres obliques; S'ils étaient, la méthode code> pathComponents code> ne rendrait que un tableau de barres obliques. Les composants de chemin sont les parties entre les barres obliques (bien qu'il y ait un cas particulier décrit dans la définition de pathComponents code>). P>

La barre oblique est le chemin séparateur em>. C'est codé dur à l'intérieur du cacao; C'est actuellement (et susceptible de toujours être) une barre oblique. Donc, si vous vouliez vraiment ajouter une barre oblique à une chaîne, la raison la plus probable serait que vous souhaitiez ajouter un chemin séparateur em>, pas un chemin composant em>. EM>. p>

    [newPath setString:rootPath];
    [newPath appendString:@"/"];
    [newPath appendString:fileName];


7 commentaires

Donc, en substance, vous fournissez les composants du chemin et StringByAppendenDPathComponent ajoute le sépérateur? De plus, je ne vois pas comment vous dites que cela ne fonctionne pas, sur mon système, il répertorie toutes les 4 images ExRC sur le chemin. Fondamentalement, NEWPATH est alloué pour la première fois, il suffit simplement de réinitialiser et de reconstruire chaque fois la boucle, en fin de compte à la fin.


Oui. Vous ne fournissez normalement qu'un composant de chemin, mais un sous-path device aussi bien.


Aussi: vous êtes correct sur newpath . Désolé pour la confusion à ce sujet; Je n'ai pas vu votre SetString: message. J'ai supprimé le paragraphe, car il ne s'applique pas au code de la version actuelle de votre question.


NP du tout, avez-vous vu la version mise à jour en haut? Il se sent bien (basé sur mes connaissances jusqu'à présent) et plus important encore.


Je l'ai mentionné dans mon commentaire précédent.


Merci, fondamentalement StringByAppinderPathcomponent ajoutera tout ce que vous y passerez à la chaîne cible.


La documentation ( iOS , MAC ) a une table de vérité montrant qu'il gère la barre oblique pour vous automatiquement.