2009-12-12 4 views
4

Je ce bout de code objectif c:Quel est le chemin d'une image dans le développement iphone

UIImage *image = [ [UIImage alloc] initWithContentsOfFile:fileName]; 

fileName est réglé sur "file1.jpg"

Quand je lance le code, cependant, l'image est définie sur zéro.

Je sais que le fichier existe Je suppose qu'il a quelque chose à voir avec le chemin.

Quel chemin dois-je utiliser?

Répondre

14

La chose à utiliser est plus facile imageNamed: comme ceci:

UIImage* theImage = [UIImage imageNamed:@"file1.jpg"]; 

Si vous devez utiliser initWithContentsOfFile: pour une raison quelconque, vous devez obtenir le chemin du faisceau, comme celui-ci:

NSString* path = [[NSBundle mainBundle] pathForResource:@"file1" ofType:@"jpg"]; 
UIImage* theImage = [[UIImage alloc] initWithContentsOfFile:path]; 
+0

Notez également qu'imageNamed mettra l'image en cache dans la mémoire pour plus tard, tandis que initWithContentsOfFile n'utilisera pas cette dernière si c'est une chose en un coup et que la mémoire est importante. – Rudi

+0

initWithContentsOfFile sera, le seul qui ne sera pas initWithData. –

+0

Le fichier image peut ne pas être dans le répertoire racine du bundle. Si c'est le cas, utilisez [[NSBundle mainBundle] pathForResource: @ "file1" deType: @ "jpg" inDirectory: @ "directory/or_subdirectory"] comme chemin. –

0

Pour obtenir le même comportement que votre code afin que votre image ne soit pas auto-libérée

UIImage* image = [[UIImage imageNamed:fileName] retain]; 
+0

Je ne vois pas de raison d'y mettre une retenue. Dans votre exemple simple, vous affectez la valeur de retour à une variable dans la portée locale, donc la conserver est presque toujours une erreur. Il est préférable de placer les appels de retenue là où ils sont nécessaires (comme lors de l'affectation à une variable dans la portée globale ou de la copie à un pointeur passé à la méthode, etc.) –

+0

L'OP a un compteur de retenue de +1, en tant que tel il en va de même pour le code de réponse. – DevDevDev

+0

Le PO est clairement nouveau pour Objective-C et le cadre de la Fondation. Il/elle peut ou ne peut pas libérer cet appel de méthode plus tard, mais il n'y a presque jamais aucune raison pour la ligne dans votre exemple, et à mon humble avis, il vaut mieux ne pas présenter des exemples qui mènent à de mauvaises habitudes. –

0

Et, bien sûr, l'image doit être dans le bundle - si vous le faites glisser dans votre projet en XCode et que vous choisissez de copier la ressource à partir des options, elle devrait simplement trouver OK.

Questions connexes