Heu dans l'ensemble c'est bien ça mais...
- d'où tu sors ce ".p" ? Ce sont des ".m" en Objective-C, pas des ".p", pour le code

(au même titre que ce sont des ".c" en C, ".cpp" en C++", ".mm" en Objective-C++, ...)
- En effet les ".h" ne font que déclarer ce qui existe et que tu peux faire (liste des méthodes, des variables de ta classe, ...) mais le code pour implémenter ces méthodes est dans le ".m". Ce ".h" est entre autres utilisé par IB quand tu fais ton interface, pour qu'il sache à quelles IBActions il peut relier par exemple les actions des boutons, ou quels IBOutlets sont déclarés et peuvent être reliés aux objets d'interface. Mais ça ne sert pas qu'à ça
- En effet, si tu utilises par exemple une classe Voiture, qui décrit les propriétés d'une voiture et les actions qu'elle peut effectuer / ses méthodes), si après tu veux utiliser la classe Voiture dans une autre classe, disons Personne, pour rajouter une propriété (une variable d'instance) "Voiture* voiturePrincipale" à cette classe Personne... Il faut que le compilo sache à ce moment ce qu'est une "Voiture".
Pour cela, tu importes le ".h" de ta classe (donc "Voiture.h") ce qui va permettre au compilateur de lire ce ".h" et donc de savoir les propriétés d'une voiture et les actions qu'on peut faire avec une voiture. A ce stade il se fiche de savoir
comment il faut faire pour démarrer une voiture par exemple, il veut juste savoir que l'on
peut démarrer une voiture, pour autoriser ton autres classe (ici "Personne") à appeler la méthode "demarre" de ton objet Voiture (
[voiturePrincipale demarre].
Savoir en quoi consister l'action de démarrer la voiture (le code de cette méthode) il verra plus tard.
Par contre si tu fais
[voiturePrincipale vole] il va savoir te remonter une erreur car il aura vu en lisant "Voiture.h" qu'une voiture ne sait pas voler.
Donc en résumé le .h décrit une classe (fichier de déclaration, tu déclares les propriétés/variables d'instance de ta classe ainsi que le nom (la "signature") des méthodes de la classe), pour que tous les autres (le reste de ton programme, les autres classes) sachent ce que tu peux faire. C'est donc ce que tu veux exposer au reste du monde (ça correspond à l'API de ta classe). Le ".m" contient le code, lui.
Comme ça, si tu récupères un petit ensemble de classes sur le net ou d'un pote, genre une classe qui te permet disons d'appliquer des effets sur une image par exemple... bah même toi en tant qu'utilisateur de la classe, tu n'as pas besoin de savoir comment ça a été codé ni de comprendre la complexité du code de ce truc que tu as récupéré, de capter les algorithmes de traitement d'image de 3km... toi t'as juste besoin de savoir comment utiliser la classe, donc quelles sont les noms et paramètres des méthodes que tu dois appeler pour utiliser cette classe. Et pour ça tu n'as besoin que de lire le ".h" des fichiers que t'as passé ton pote (ou que tu as récupéré sur le net), pas besoin d'éplucher le .m qui fait 50x plus de lignes !