2010-10-15 7 views
3

J'initialize une vue (image) par:Où est ma variable? objectif-c

Image *myImageView = [[Image alloc]init]; 
    myImageView.myId = randomImageNumber; 
    [myImageView initWithImage:myImage]; 

à la classe Image je fais un journal (LOG1) et obtenir le randomImageNumber précédemment défini. Plus tard, dans la même classe, je fais un deuxième journal (LOG2). Pourquoi mon deuxième journal n'a plus aucune valeur?

Voici mon implémentation fichier de l'image de la classe:

@synthesize myId; 
-(id) initWithImage: (UIImage *) anImage 
{ 
    NSLog(@"LOG1%d",myId); 
    if ((self = [super initWithImage:anImage])) 
    { 
     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 

} 
-(void)touchesBegan... 
.... 
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"LOG2%d",myId); 
} 

Le « retour auto » vide myId que je déclarais dans l'en-tête et le fichier qui a été mis à l'initialisation. Comment puis-je empêcher cela?

mon Headerfile ressemble à ceci:

@interface Image : UIImageView 
{ 
    int myId; 
} 
@property (assign) int myId; 

@end 

Répondre

2

choses Couple dans votre code. N'appelez JAMAIS init plus d'une fois sur un objet, qui vissera simplement votre objet.

Modifier à ceci:

Image *myImageView = [[Image alloc] initWithImage:myImage]; 
myImageView.myId = randomImageNumber; 

C'est votre problème, par défaut lors de l'initialisation d'une sous-classe de NSObject, toutes les propriétés sont mises à 0 (ou nil si elles sont des pointeurs).

Si vous avez besoin d'avoir une valeur par défaut pour myId faites ceci:

// Image.m 

@implementation 

// other code 

-(id) initWithImage:(UIImage *) image 
{ 
    if (self = [super initWithImage:image]) 
    { 
     self.myId = randomImageNumber; 
    } 

    return self; 
} 

// other code 

@end 
+0

Ok, j'ai essayé ce genre d'initialisation, mais dans ce cas, même mon premier journal ne m'a pas donné une valeur -> 0 juste comme vous avez dit. Comment puis-je initialiser ma classe d'images sans perdre mes variables d'instance déclarées dans l'en-tête (de la classe Image)? – algro

+0

@algro Le premier log * devrait * donner 0. Les variables d'instance sont toujours vides jusqu'à ce qu'elles soient initialisées - on ne peut leur donner une valeur dans l'interface, seulement déclarée. Vous devriez probablement poster ce qui est dans votre fichier d'en-tête, car il semble qu'il y ait un malentendu ici. – walkytalky

+0

ok, j'ai posté mon fichier d'en-tête ... Ce n'est pas grave si le premier log est 0. J'en ai besoin seulement si touché -> LOG2. À ce stade, la valeur doit être définie non? – algro

Questions connexes