2009-09-24 13 views
1

J'essaye d'écrire une bibliothèque statique de cacao-contact. Pour rester simple, je préférerais ne pas utiliser de variables privées dans mon fichier d'interface. Le bon code ressemble maintenant à ceci:Comment déplacer des variables non statiques de l'interface à l'implémentation dans objectiveC?

fichier d'interface

(myView.h):

@interface myView: UIView { 

NSTimer * myTimer; 

} 

@end 

@implementation myView 

@end 

fichier d'implémentation (myView.h)

Ce pointeur NSTimer est juste une variable privée donc j'ai essayé ceci: (ne fonctionne pas)

fichier d'interface (myView.h):

@interface myView: UIView { 

} 

@end 

fichier de mise en œuvre (myView.h)

NSTimer * myTimer; 

@implementation myView 

@end 

Il semble fonctionner mais il est avéré que la minuterie est maintenant une variable statique.

Suis-je en train de me tromper ou n'y a-t-il pas de solution?

Répondre

2

Vous ne pouvez pas définir de variables d'instance dans votre fichier d'implémentation.

Une solution possible est d'avoir une structure privée contenant les variables privées et ont une variable privée publiquement déclaré pointage à cette structure privée:

@interface MyView { 
    void *privateData; 
} 

fichier de mise en œuvre:

typedef struct { 
    NSTimer *myTimer; 
} PrivateData; 


@implementation MyView() 

@property (readonly) PrivateData *privateData; 

@end 


@implementation MyView 

- (id) init { 
    if (self = [super init]) { 
     privateData = malloc(sizeof(PrivateData)); 

     self.privateData->myTimer = nil; // or something else 
    } 

    return self; 
} 

-(PrivateData *) privateData { 
    return (PrivateData *) self->privateData; 
} 

- (void) myMethod { 
    NSTimer *timer = self.privateData->myTimer; 
} 

- (void) dealloc { 
    // release stuff inside PrivateData 
    free(privateData); 
    [super dealloc]; 
} 

@end 

Il est pas beau mais ça marche. Peut-être qu'il y a de meilleures solutions.

+0

c'est vraiment moche (+1) de toute façon – jantimon

+0

Cela devrait être mis à jour. Vous pouvez maintenant avoir des variables d'instance définies dans votre fichier d'implémentation (.m). – mahboudz

+0

Solution mise à jour: '@implementation ClassName {// Déclarations de variable d'instance. } ' http://stackoverflow.com/questions/10407848/is-this-a-new-way-to-define-private-instance-variables-in-objective-c – smileham

1

Juste une note; essayer de cacher iVar pour la sécurité est idiot. Ne t'embête pas.

Par souci de simplicité, cependant, il a de la valeur.

Cependant, deux solutions:

(1) Si le ciblage iPhone OS ou 64 bits de cacao, vous pouvez @synthesize le Ivar:

.h:

@interface Foo:NSObject 
@property(readwrite, copy) NSString *publiclyReadwriteNoiVar; 
@property(readonly, copy) NSString *publiclyReadonlyPrivatelyReadwriteNoiVar; 
@end 

Foo .m:

@interface Foo() 
@property(readwrite, copy) NSString *privateProperty; 
@end 

@implementation Foo 
@synthesize publiclyReadwriteNoiVar, publiclyReadonlyPrivatelyReadwriteNoiVar, privateProperty; 
@end 

(2) Utilisez une sous-classe privée un peu comme des grappes de classe:

.h:

@interface Foo:NSObject 
@end 

Foo.m:

@interface RealFoo:Foo 
{ 
    .... ivars here .... 
} 
@end 
@implementation RealFoo 
@end 

@implementation Foo 
+ (Foo *) convenienceMethodThatCreatesFoo 
{ 
    .... realFoo = [[RealFoo alloc] init]; .... 
    return realFoo; 
} 
@end 
Questions connexes