2010-09-07 11 views
1

J'ai une vue avec un scrollview. J'utilise du code pour ajouter des étiquettes à la scrollview. Comme il y a beaucoup de code redondant, j'ai essayé de déplacer la création de l'étiquette vers une fonction séparée qui retourne un UILabel. Ici 'cette fonction:Fonction iPhone pour créer UILabel échoue et se bloque

- (UILabel *) f_MakeLabelWithL:(float)MyLeft T:(float)MyTop W:(float)MyWidth H:(float)MyHeight Align:(UITextAlignment)MyAlign 
         Font:(UIFont *)MyFont TextColor:(UIColor *)MyTextColor BGColor:(UIColor *)MyBGColor { 

CGRect rect = CGRectMake(MyLeft, MyTop, MyWidth, MyHeight); 
UILabel *label = [[[UILabel alloc] initWithFrame:rect] autorelease]; 

label.adjustsFontSizeToFitWidth = YES; 
label.backgroundColor = MyBGColor; 
label.font = MyFont; 
label.numberOfLines = 0; 
label.textAlignment = MyAlign; 
label.textColor = MyTextColor; 

return label; 
} 

Je définis le texte de l'étiquette après son retour. Ou alors j'ai prévu. En fait, une étiquette dont l'arrière-plan est bleu apparaît sous la forme d'un rectangle noir uni. Un avec un fond clair est tout à fait clair. Pire encore: le scrollview ne défilera pas, et tenter de le faire le fera pour faire tomber l'application sans aucune explication dans la console du débogueur.

Pourtant, tout ce code fonctionne bien en ligne et dandy.

Quelqu'un sait pourquoi?

Mise à jour: La mise en ligne du code a permis de corriger l'affichage des étiquettes. Mais j'utilise aussi une fonction pour créer des images:

- (UIImageView *) f_MakeImageWithL:(float)MyLeft T:(float)MyTop W:(float)MyWidth H:(float)MyHeight File:(NSString *)MyFile { 
CGRect rect = CGRectMake(MyLeft, MyTop, MyWidth, MyHeight); 
UIImageView *oImageView = [[[UIImageView alloc] initWithFrame:rect] autorelease]; 

NSString *s = [[Isystant f_DocumentsPath] stringByAppendingPathComponent:MyFile]; 
UIImage *oImage = [UIImage imageWithContentsOfFile:s]; 
[oImageView setImage:oImage]; 
oImageView.backgroundColor = [UIColor redColor]; 
oImageView.opaque = YES; // explicitly opaque for performance 

return oImageView; 
} 

Il a été crée les images, mais le problème de défilement/crash gelé ne disparaît pas jusqu'à ce que je mets ce code de retour aussi en ligne.

Répondre

1

Il me semble que vous sur-relâchez le UILabel. Vous ne devriez pas avoir à relâcher l'étiquette après l'avoir ajoutée à votre scrollview si elle n'a jamais été conservée auparavant (et que vous l'avez auto-libérée dans la méthode makeImageWithL).

C'est probablement pourquoi cela fonctionne quand vous le mettez en ligne ... parce que dans ce scénario, je parierais que vous supprimez la autorelease, non?

S

+0

Exactement! J'ai oublié que lorsque je reçois un contrôle d'une fonction, je n'ai pas besoin de le relâcher. Ce que vous n'allouez pas init, vous ne le libérez pas! Mon indice aurait dû être le crash sans aucune explication dans la console du débogueur. Cela semble toujours se produire lorsque le problème est trop relâché. Infiniment reconnaissant. (Juste pour plus de clarté: ce qui fonctionne est de libérer le contrôle dans la fonction, mais pas de libérer la variable d'objet qui était le récepteur de la fonction.) –

1

Conservez-vous votre étiquette retournée quelque part?

+0

essayer de ne pas utiliser autorelease, essayez également définir la propriété de texte à quelque chose avant de retourner pour voir si ça aide. –

+0

Je ne conserve pas l'étiquette. Dès que je l'ajoute à la sous-vue du scrollview, je le libère. En ce qui concerne autorelease, une fonction qui crée et retourne une étiquette doit la libérer. Une fois que la fonction renvoie l'étiquette, elle n'aurait aucun moyen de la relâcher si elle ne l'autorelait pas, ce qui ferait perdre de la mémoire. –