2010-05-26 15 views
2

Je crée une bibliothèque statique pour partager en utilisant le guide suivant: http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.htmliPhone bibliothèques statiques: Comment cacher variable d'instance

Dans l'une des fonctions, je reviens d'un « SomeUIView » qui est une sous-classe de UIView et est défini dans l'en-tête public, mais je ne veux pas exposer la variable d'instance interne de SomeUIView dans l'en-tête public.

J'ai essayé d'utiliser des catégories pour un fichier d'en-tête interne privé pour SomeUIView, mais je continue de courir dans "Déclaration d'interface en double pour la classe 'SomeUIView'".

Est-ce que quelqu'un sait comment faire cela?

Merci!

Répondre

3

Les catégories et les extensions ne peuvent pas ajouter de variables d'instance à une classe. Je vais pour l'idiome PIMPL ici - utiliser un objet de mise en œuvre privée:

// header 
@class MyObjImpl; 
@interface MyObj { 
    MyObjImpl* impl; 
} 
@end 

// implementation file: 
@interface MyObjImpl { 
    id someIvar; 
} 
// ... 
@end 

// ... etc. 

Cela permet également l'interface publique stable au cas où vous voulez ajouter quelque chose pour un usage interne.

Le "Interface double" provient de parenthèses manquantes dans la deuxième déclaration d'interface:

// header: 
@interface MyObj 
// ... 
@end 

// implementation file: 
@interface MyObj() // note the parentheses which make it a class extension 
// ... 
@end 
+0

Notez qu'une mise en œuvre privée (une Pimple ... mon deuxième favori à côté de l'acronyme NARC), a gagné ne cachez pas les ivars ... vous pouvez toujours les trouver si vous creusez suffisamment à l'exécution. – bbum

0

Vous pouvez également utiliser la fonction Objective-C 2 appelée "référence Associatif".

Ce n'est pas vraiment API orientée objet, mais vous pouvez ajouter/supprimer objet à un autre objet en utilisant des fonctions simples du moteur d'exécution:

void objc_setAssociatedObject(id object, void * key, id value) 

Définit la valeur ou le supprimer lorsque la valeur est nulle.

id objc_getAssociatedObject(id object, void * key) 

Récupérez la valeur de la clé spécifiée.

Notez qu'il s'agit également d'un moyen d'ajouter une variable d'instance à un objet existant lors de l'implémentation d'une catégorie.

clé est l'art pointeur simple variable privée que vous pouvez déclarer en tant que privé module en utilisant:

static char SEARCH_INDEX_KEY = 0;