Le simulateur d'iPhone est un morceau vraiment cool de logiciels. Bien que je fais la plupart de mes essais de développement sur un iPhone ou iPod Touch, j'aime vraiment avoir la possibilité d'exécuter du code lorsque je n'ai pas un appareil pratique. C'est une pièce vraiment cool de la technologie.
Parfois, il peut être carrément ennuyeux, cependant. Aujourd'hui, j'ai frappé un exemple de cela. Je travaille sur une project qui doit fonctionner sur Mac et l'iPhone, et il fait un peu juste de bidouillent dans le runtime. J'ai écrit des programmes en utilisant à la fois pour le Mac et l'iPhone sans aucun problème, mais périodiquement obtiendrait e-mail de quelqu'un demandant si je pouvais faire le travail pour l'iPhone.
Eh bien, il s'avère blush * *... Je dois avoir jamais réellement testé le code sur un iPhone ou un iPod Touch, et seulement utilisé ce code particulier dans le simulateur et sur le Mac. Vous voyez, j'ai cette ligne de code:
Et que le code fonctionne très bien et dandy pour le Mac, et pour le simulateur d'iPhone. Mais, devinez quoi? obj / objc-runtime.h ne semble pas exister dans le SDK iPhone, donc quand vous mettez le SDK pour le périphérique, puis de compiler, la compilation se passe dans un flamboiement de gore (non, pas la gloire, gore ... c'est moche).
Fixation il était relativement triviale une fois que j'ai trouvé le problème. Le fichier objc / objc-runtime.h est un fichier en-tête très simple. Voici à quoi il ressemble sur le Mac:
C'est tout. Et ces deux fichiers existent pour le SDK appareil. Alors, j'ai simplement remplacé le # import déclaration avec les deux déclarations # import qu'il contenait, et voil'a, il a commencé à travailler à nouveau. Assez.
Il compilé sans erreurs, mais j'ai eu tout un tas d'avertissements, tous centrés autour de l'utilisation de deux méthodes, il n'a pas pu trouver:-className et className +. Ces méthodes ne font que retourner le nom de la classe, on est mis en œuvre une méthode d'instance, l'autre comme une méthode de classe. Je n'ai aucune idée pourquoi ces deux méthodes n'existent pas pour le SDK de périphérique, mais ce fut aussi assez facile à corriger, puisque le nom de classe est disponible par le biais des appels d'exécution.
J'ai ajouté les deux méthodes, mais enveloppé le code dans une déclaration pré-compilateur conditionnelle ainsi il obtient seulement utilisé lors de la compilation pour l'iPhone:
Ainsi, dans le fichier d'entête:
Actuellement, ce trouve sur la classe où j'en avais besoin, mais je vais le déplacer dans une catégorie sur NSObject. La mise en œuvre de ces deux méthodes est presque aussi court:
Et c'est tout pour aujourd'hui, je vais me coucher.
Parfois, il peut être carrément ennuyeux, cependant. Aujourd'hui, j'ai frappé un exemple de cela. Je travaille sur une project qui doit fonctionner sur Mac et l'iPhone, et il fait un peu juste de bidouillent dans le runtime. J'ai écrit des programmes en utilisant à la fois pour le Mac et l'iPhone sans aucun problème, mais périodiquement obtiendrait e-mail de quelqu'un demandant si je pouvais faire le travail pour l'iPhone.
Eh bien, il s'avère blush * *... Je dois avoir jamais réellement testé le code sur un iPhone ou un iPod Touch, et seulement utilisé ce code particulier dans le simulateur et sur le Mac. Vous voyez, j'ai cette ligne de code:
#import
Et que le code fonctionne très bien et dandy pour le Mac, et pour le simulateur d'iPhone. Mais, devinez quoi? obj / objc-runtime.h ne semble pas exister dans le SDK iPhone, donc quand vous mettez le SDK pour le périphérique, puis de compiler, la compilation se passe dans un flamboiement de gore (non, pas la gloire, gore ... c'est moche).
Fixation il était relativement triviale une fois que j'ai trouvé le problème. Le fichier objc / objc-runtime.h est un fichier en-tête très simple. Voici à quoi il ressemble sur le Mac:
#import
#import
C'est tout. Et ces deux fichiers existent pour le SDK appareil. Alors, j'ai simplement remplacé le # import
Il compilé sans erreurs, mais j'ai eu tout un tas d'avertissements, tous centrés autour de l'utilisation de deux méthodes, il n'a pas pu trouver:-className et className +. Ces méthodes ne font que retourner le nom de la classe, on est mis en œuvre une méthode d'instance, l'autre comme une méthode de classe. Je n'ai aucune idée pourquoi ces deux méthodes n'existent pas pour le SDK de périphérique, mais ce fut aussi assez facile à corriger, puisque le nom de classe est disponible par le biais des appels d'exécution.
J'ai ajouté les deux méthodes, mais enveloppé le code dans une déclaration pré-compilateur conditionnelle ainsi il obtient seulement utilisé lors de la compilation pour l'iPhone:
Ainsi, dans le fichier d'entête:
#if (TARGET_OS_IPHONE)
- (NSString *)className;
+ (NSString *)className;
#endif
Actuellement, ce trouve sur la classe où j'en avais besoin, mais je vais le déplacer dans une catégorie sur NSObject. La mise en œuvre de ces deux méthodes est presque aussi court:
#if (TARGET_OS_IPHONE)
- (NSString *)className
{
return [NSString stringWithUTF8String:class_getName([self class])];
}
+ (NSString *)className
{
return [NSString stringWithUTF8String:class_getName(self)];
}
#endif
Et c'est tout pour aujourd'hui, je vais me coucher.
Aucun commentaire:
Enregistrer un commentaire