2010-09-10 10 views
1

Je suis absolument perplexe. Mon application fonctionnant correctement [sur iOS < = 3.1] s'est écrasée sur iOS4. Quand j'ai essayé de le déboguer, j'ai vu qu'il plantait sur cette ligne:UITextView alloc bloque l'application sur iOS4

EDIT: J'ai essayé de changer la position de cette instruction et de mettre quelques instructions de journal à vérifier et j'ai pu confirmer que l'application plante juste à cette ligne.

Ceci est une partie de mon code:

//Various allocations here like 

lblForAttachingPhoto = [[UILabel alloc]initWithFrame:CGRectMake(235, 105, 40, 20)]; 
lblForAttachingPhoto.backgroundColor = [UIColor grayColor]; 
[lblForAttachingPhoto setText:@"140"]; 
[lblForAttachingPhoto setTextAlignment:UITextAlignmentCenter]; 

btnAttachPhoto = [UIButton buttonWithType:UIButtonTypeCustom]; 
btnAttachPhoto.frame = CGRectMake(275, 105, 20, 20); 
btnAttachPhoto.autoresizesSubviews = YES; 
btnAttachPhoto.clipsToBounds = YES; 
[btnAttachPhoto setImage:[UIImage imageNamed:@"arrow.jpg"] forState:UIControlStateNormal]; 
[btnAttachPhoto addTarget:self action:@selector(attachPhoto) forControlEvents:UIControlEventTouchUpInside]; 

viewForAttaching = [[UIView alloc]init]; 
viewForAttaching.frame = CGRectMake(5, -340, 310, 140); 


for(NSInteger e=0;e<[_appDelegate.genericArray count];e++) 
{ 
    [genericArray addObject:[_appDelegate.genericArray objectAtIndex:e]]; 
} 

for(NSInteger f=0; f< [_appDelegate.category_type count]; f++) 
{ 
    [category_type addObject:[_appDelegate.category_type objectAtIndex:f]]; 
} 

txtVw = [[UITextView alloc]init];  //txtVw is a textview 

Mais en dépit de la position de la déclaration de la déclaration d'attribution de textview, cela rend le crash de l'application.

Sortie de la console:

  Program received signal: “EXC_BAD_ACCESS”. 
      warning: check_safe_call: could not restore current frame 

      warning: Unable to restore previously selected frame. 

Est-il possible? J'applique également le protocole UITextViewDelegate.

Quelqu'un peut-il aider s'il vous plaît?

Merci d'avance.

+0

Pouvez-vous poster un autre code lié à votre txtVw? Est-il déclaré dans un .h? Si vous le déclarez propriété, le synthétisez-vous? – MishieMoo

+0

Non, je ne l'ai pas déclaré comme une propriété, donc je ne l'ai pas synthétisé. Ce code est essentiellement dans viewDidLoad de ma classe. – neha

Répondre

2

Il est peu probable que le plantage soit dû à l'initialisation UITextView. Je suspecte la ligne au-dessus dans la boucle for(). Vous avez une gestion des noms et de la mémoire très incohérente, ce qui est dangereux dans ObjC.

D'abord, donnez à vos variables des noms cohérents. category_type ressemble à une énumération, mais il semble être un NSMutableArray. Ce genre de dénomination vous tuera dans ObjC; vous devez garder une trace de ce que sont les choses parce que le compilateur n'attrape souvent pas les discordances de type. Vous devriez avoir un nom comme categoryTypes.

Ensuite, vous ne devriez pas accéder à vos ivars directement. Toujours utiliser des accesseurs. Toujours. (Sauf peut-être dans dealloc, il y a controverse là.) Ceci est la façon # 1 d'éviter EXC_BAD_ACCESS. De toute évidence, vous ne retenez pas quelque chose correctement. Les accesseurs protègent contre cela.

Voulez-vous vraiment ajouter _appDelegate.genericArray à genericArray? Ou voulez-vous vraiment faire genericArray une copie de _appDelegate.genericArray? Ou voulez-vous simplement que genericArray pointe vers _appDelegate.genericArray? Si vous voulez une copie, il suffit de copier:

self.genericArray = [NSMutableArray arrayWithArray:self.appDelegate.genericArray]; 

Je sais que tout cela sonne comme « juste le style, » mais style cohérent est absolument essentiel à ObjC stable. Vous voyez les types d'accidents ennuyeux que vous obtenez autrement.

Vous devez également appuyer sur "Cmd-Shift-A" et laisser l'analyseur statique rechercher les bogues pour vous.

+0

Rob, j'apprécie votre aide. Merci pour la bonne explication. Mais cela n'a pas résolu mon problème. Il s'écrase toujours sur la même ligne. Et peu importe où j'écris cette ligne, le programme se bloque lui-même, comme si je l'écris comme une première déclaration dans mon viewDidLoad puis il se bloque là sans traiter aucune autre instruction. C'est vraiment frustrant. – neha

+1

OK, décomposer. Commencez par "[UITextView alloc]". Ne l'associez même pas à une variable. Ensuite, essayez [[UITextView alloc] init]. Ensuite, essayez d'attribuer "nil" à la variable. Ensuite, essayez d'assigner la textview à une variable de pile, puis assignez la variable stack à l'ivar (assurez-vous de compiler dans Debug, pas Release, donc ce n'est pas optimisé). –

0

Vous devez conserver la variable txtVw. Le problème est que lorsque votre code arrive à assigner un objet à txtVw, l'application l'a "oublié". Essayez ceci pour le réparer. Dans votre méthode init faire:

txtVw = [[UITextView alloc]init]; 
[txtVw retain]; 

si vous ne déclarez pas comme une propriété, alors il ne conservera pas la variable et va l'oublier très rapidement.

Je suppose que c'est votre problème. Si ça ne marche pas, dis-le moi et j'aurai un autre regard.

+0

+ alloc a déjà retenu txtVw. Il n'y a généralement aucune raison de le conserver en plus ici. Si vous affectez un objet généré avec + alloc à un ivar conservé, vous devez également le libérer ou vous fuire. –