2009-09-30 8 views
2

Ce:Comment réutiliser un UILabel? (Ou tout autre objet)

UILable *myLabel = [[UILabel alloc] init]; 
    UILable *myLabel = [[UILabel alloc] init]; 

me donne une erreur de redéfinition.

Mais ceci:

for(i=0;i<5;i++) 
    { 
     UILable *myLabel = [[UILabel alloc] init]; 
     // some label code here 
     [self.view addSubview:myLabel]; 
     [myLabel release]; 
    } 

ne fonctionne pas. Alors, est-ce que le second est faux? Dois-je le définir avant et juste le réutiliser?

Est-ce exact:

UIIMageView *Sign; 
//Some Sign Stuff 
    Sign = [[UIImageView alloc]init]; 
     Sign.image = [UIImage imageNamed:@"Minus.png"]; 
     frame = CGRectMake(160 ,80, 64, 64); 
     Sign.frame = frame; 
     [scrollView addSubview:Sign]; 
     Sign = nil; 
     [Sign release]; 
//Some other Sign stuff 
    Sign = [[UIImageView alloc]init]; 
     Sign.image = [UIImage imageNamed:@"Plus.png"]; 
     frame = CGRectMake(200 ,80, 64, 64); 
     Sign.frame = frame; 
     [scrollView addSubview:Sign]; 
     Sign = nil; 
     [Sign release]; 

est-ce exact? Cela ne marche pas sans le signe = zéro. Donc, il semble un peu bancal aussi.

Répondre

1

Vous ne pouvez pas avoir des noms de variables identiques utilisés dans la même étendue de niveau de bloc. Donc, dans votre premier exemple, vous ne pouvez pas avoir une définition de variable avec le même nom, vous devez les nommer différemment.

- (void) method { 
    UIImageView* image1; 

    // here we define a new block scope. This can be a block of any kind (while, for, if) 
    { 
     // All reference in this block to this variable will see this definition. 
     UIImageView* image1; 

     // Using image1 here 
    } 

    // Here we see again the image1 defined at the beginning of the method. 
} 

Dans votre exemple de boucle, vous êtes dans une nouvelle portée qui est réinitialisée après chaque itération.

Votre troisième exemple est correct car il ne définit la variable qu'une seule fois. Vous réutilisez cette variable après pour affecter un nouvel objet. Le troisième est moins élégant dans la mesure où votre nom de variable ne décrit pas bien pour chaque cas quel est leur but.

Pour votre cas de 'Sign = nil' cela fait effectivement la ligne qui suit inutile puisque dans Objective-C un message envoyé à un objet nul est ignoré.

Je suggère de définir une méthode que vous pouvez appeler pour créer vos images qui se ressemblent. Quelque chose comme:

- (void) createImage:(NSString*) image frame:(CGRect) frame { 
    UIImageView *Sign; 
    Sign = [[UIImageView alloc]init]; 
    Sign.image = [UIImage imageNamed:image]; 
    Sign.frame = frame; 
    [self.scrollView addSubview:Sign]; 
    [Sign release]; 
} 
0

Votre boucle for est parfaitement bien. La portée de myLabel est limitée à une seule exécution de votre boucle for. Chacun d'entre eux lance une nouvelle variable pour contenir la référence à votre UILabel.

Le deuxième code que vous avez publié a des fuites.

Sign = nil 
[Sign release] 

Cela libèrera l'objet à l'adresse nil et non l'objet que vous avez créé. Je ne vois pas ce qui ne va pas avec votre code, mais votre solution ne corrige définitivement pas la cause première. Peut-être que cela aidera à poster quelle erreur/avertissement vous obtenez en supprimant Sign = nil.

Notez également que le démarrage de vos noms de variable avec une lettre majuscule n'est pas une bonne convention de dénomination, car les noms de classe commencent généralement par un.

Questions connexes