Fonctions cachées de Objective-C

voix
12

Objective-C devient une utilisation plus large en raison de son utilisation par Apple pour Mac OS X et le développement iPhone. Quelles sont vos fonctions « cachées » préférées de la langue Objective-C?

  • Une caractéristique par réponse.
  • Donner un exemple et une courte description de la fonction, non seulement un lien vers la documentation.
  • Étiquette de la fonction en utilisant un titre comme la première ligne.
Créé 17/10/2008 à 09:06
utilisateur
Dans d'autres langues...                            


8 réponses

voix
16

Posing

Objective-C permet une classe de remplacer entièrement une autre classe dans une application. La classe remplaçant est dit « poser comme » la classe cible. Tous les messages envoyés à la classe cible sont ensuite reçus par la place de la classe posing. Il y a des restrictions sur les classes peuvent poser:

  • Une classe ne peut se présenter comme l'un de ses superclasses directes ou indirectes
  • La classe ne doit pas définir posing de nouvelles variables d'instance qui sont absentes de la classe cible (bien qu'il peut définir ou redéfinir les méthodes).
  • Aucun message doit avoir été envoyé à la classe cible avant la pose.

Se faisant passer, de façon similaire à des catégories, permet augmenter globalement les classes existantes . Posing permet deux fonctionnalités absentes des catégories:

  • Une classe peut appeler des méthodes posing surchargées par super, intégrant ainsi la mise en œuvre de la classe cible.
  • Une classe de pose peut remplacer les méthodes définies dans les catégories.

Un exemple:

@interface CustomNSApplication : NSApplication
@end

@implementation CustomNSApplication
- (void) setMainMenu: (NSMenu*) menu
{
     // do something with menu
}
@end

class_poseAs ([CustomNSApplication class], [NSApplication class]);

Cette invocation intercepte toutes les setMainMenu à NSApplication.

Créé 17/10/2008 à 09:37
source utilisateur

voix
10
#include <Foundation/Debug.h>

Beaucoup d'outils pour essayer de traquer les fuites de mémoire, deallocs prématurés, et plus dans ce fichier d'en-tête.

Créé 17/10/2008 à 14:39
source utilisateur

voix
15

Objet Transfert / méthode manquante

Lorsqu'un objet est envoyé un message pour lequel il n'a pas de méthode, le système d'exécution donne une autre chance de gérer l'appel avant d'abandonner. Si l'objet prend en charge un -forward :: méthode, le moteur d'exécution appelle cette méthode, en lui transmettant des informations sur l'appel non prise en charge. La valeur de retour de l'appel transféré est propagée à l'appelant initial du procédé.

-(retval_t)forward:(SEL)sel :(arglist_t)args {
  if ([myDelegate respondsTo:sel])
 return [myDelegate performv:sel :args]
 else
 return [super forward:sel :args];
 }

Contenu de l' Objective-C Pocket Reference

Ceci est très puissant et est largement utilisé dans la communauté Ruby pour les différents DSLs et rails, etc. Smalltalk qui en sont originaires à la fois influencé Objective-C et Ruby.

Créé 18/10/2008 à 01:45
source utilisateur

voix
20

procédé Swizzling

En fait, lors de l'exécution, vous pouvez échanger sur une mise en œuvre d'une méthode avec un autre.

Voici une explication avec le code.

Un cas d'utilisation est intelligent pour le chargement paresseux d'une ressource partagée: vous habituellement mettre en œuvre une sharedFoométhode par l' acquisition d' un verrou, créant ainsi le foocas échéant, obtenir son adresse, libérant le verrou, puis retourner le foo. Cela garantit que le fooest créé uniquement une fois, mais tous les déchets d'accès ultérieur du temps avec un verrou qui n'est pas nécessaire plus.

Avec la méthode swizzling, vous pouvez faire la même chose qu'avant, sauf une fois l' fooa été créé, l' utilisation swizzling d'échanger sur la mise en œuvre initiale de sharedFooun deuxième qui ne vérifie pas et renvoie simplement fooque nous savons maintenant a été créé!

Bien sûr, la méthode swizzling peut vous causer des problèmes, et il peut y avoir des situations où l'exemple ci - dessus est une mauvaise idée, mais bon ... c'est pourquoi il est caché caractéristique.

Créé 18/10/2008 à 04:23
source utilisateur

voix
4

Objective-C Runtime Référence

Il est facile d'oublier que le sucre syntaxique de l'Objective-C est converti en appels de fonctions normales C qui sont l'objet-C Runtime. Il est probable que vous aurez jamais besoin de se plonger réellement dans et utiliser quoi que ce soit dans le moteur d'exécution. Voilà pourquoi je considérer cela comme une « fonction cachée ».

Permettez-moi de donner un moyen on peut utiliser le système d'exécution.

Disons que quelqu'un est la conception d' une API cadre externe qui sera utilisé par des tiers. Et que quelqu'un conçoit une classe dans le cadre qui représente abstraitement un paquet de données, nous allons l' appeler MLAbstractDataPacket. Maintenant , il est à l'application qui est un lien dans le cadre de la sous - classe MLAbstractDataPacketet définir les paquets de données de sous - classe. Chaque sous - classe doit remplacer la méthode +(BOOL)isMyKindOfDataPacket:(NSData *)data.

Avec cette information à l'esprit ...

Ce serait bien si MLAbstractDataPacketfourni une méthode pratique qui a renvoyé la classe initialisée correcte pour un paquet de données qui se présente sous la forme +(id)initWithDataPacket:(NSData *)data.

Il n'y a qu'un seul problème. La superclasse ne connaît pas l' une de ses sous - classes. Alors là , vous pouvez utiliser la méthode d'exécution objc_getClassList()ainsi que objc_getSuperclass()pour trouver les classes qui sont sous - classes de MLAbstractDataPacket. Une fois que vous avez une liste des sous - classes , vous pouvez essayer +isMyKindOfDataPacket:sur chacun jusqu'à ce que l' on se trouve ou non trouvé.

Les informations de référence sur ce qui peut être trouvé à http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html .

Créé 18/10/2008 à 06:24
source utilisateur

voix
10

Catégories

Utilisation de catégories, vous pouvez ajouter des méthodes aux classes intégrées sans sous - classement. Référence complète .

Il est agréable d'ajouter des méthodes pratiques à utiliser couramment des classes, comme NSString ou NSData.

Créé 22/10/2008 à 19:15
source utilisateur

voix
0

J'aime la méthode verbeux nommant comme [myArray writeToFile:myPath atomically:YES], où chaque argument a une étiquette.

Créé 22/10/2008 à 19:23
source utilisateur

voix
11

ISA commutation

Vous avez besoin de passer outre tous les comportements d'un objet? Vous pouvez réellement changer la classe d'un objet actif avec une seule ligne de code:

obj->isa = [NewClass class];

Cela ne change la classe qui reçoit des appels de méthode pour cet objet; il ne change pas la mise en page de l'objet en mémoire. Ainsi, ce n'est vraiment utile lorsque vous avez un ensemble de classes avec les mêmes Ivars (ou avec un sous-ensemble des autres) et que vous voulez basculer entre eux.

Un morceau de code que j'ai écrit utilise pour le chargement paresseux: il alloue un objet de classe A, remplit un couple Ivars critiques (dans ce cas, principalement un nombre record) et fait passer le isapointeur pour pointer vers LazyA. Quand une méthode autre qu'un très petit comme releaseet retainest appelé, LazyAcharge toutes les données à partir du disque, des finitions de remplissage dans les Ivars, fait passer le isapointeur sur A, et transmet l'appel à la classe réelle.

Créé 25/03/2009 à 00:11
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more