2010-11-30 4 views
0

J'ai un UITableViewController et je mis quelques propriétés dans le viewDidLoadMethod comme ceci:UITableVue fuite?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self.parentViewController.parentViewController action:@selector(dismissSettings)] autorelease]; 
    [self setTitle:@"Gabbai Settings"]; 

    //Set up the table 
    [self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped]; 

    [self.tableView setRowHeight:65.0]; 
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLineEtched]; 

    [self.tableView.backgroundView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@_settings", kTheme] ofType:@"png"]]]]; 


} 

L'application montre un UIScrollViewController et un UIButton. Lorsque le bouton est enfoncé, l'application affiche un UINavigationController modal et UINavigationController contient un UITableViewController.

Pour une raison quelconque, Leaks signale une fuite lorsque j'affiche le UITableViewController. Cependant, si je commente les quatre lignes après //Set up the table, tout va bien.

Lorsque les quatre lignes ne sont pas, l'instrument Fuites montre les éléments suivants:

Screenshot of Leaks Instrument

Je ne suis pas sûr de ce qui se passe ici, mais il est vraiment ennuyeux. J'ai utilisé les mêmes quatre lignes de code avant de personnaliser mon UITableViewController et ceci est un nouveau comportement.

Qu'est-ce qui pourrait ne pas fonctionner?

Répondre

1

Comme il a été souligné par d'autres réponses, votre problème est la ligne:

[self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped]; 

Il va créer un nouvel objet UITableView et il ne modifier self.tableView ce qui signifie que la ligne est totalement inutile. Cela crée seulement la fuite que vous rencontrez. Retirez-le et vous devriez aller bien.

+0

Comment puis-je changer le style de la vue de la table? – Moshe

+0

Vous ne pouvez pas modifier le style de la table lors de la création de UITableView. Utilisez-vous un NIB et Interface Builder? Ensuite, vous pouvez changer le style là-bas. Sinon, vous pouvez le faire dans 'loadView' ou lorsque vous créez' UITableViewController' en utilisant 'initWithStyle:'. –

+0

Enlever cela a résolu le problème. – Moshe

0

On dirait que vous avez un tableau ou un dictionnaire qui fuit, pas le tableau.

Quelle est la matrice que vous utilisez pour remplir votre vue de table?

En outre, vous ne voudrez pas [self.tableVIew initWithFrame, essayer [self.tableView setFrameCGRectMake(x,y,w,h)];

+0

Je ne suis pas à l'aide d'un tableau, je mise tout manuellement à l'intérieur méthode 'cellForRowAtIndex'. – Moshe

+0

Eh bien c'est ce qui fuit est un tableau/dictionnaire quelque part, selon votre image de fuites. – WrightsCS

+0

Lors de la réinitialisation de UITableView, le contenu de l'ancienne version a été divulgué, d'où la fuite de NSArray. – Moshe

1

si self.tableview existe déjà, vous ne voulez pas l'initialiser à nouveau. Soit l'initialiser une fois (ce que je suppose que vous avez déjà fait, peut-être en chargeant à partir d'une plume) et si nécessaire, réinitialiser le cadre ici.

Ou juste alloc/init la vue de table ici.

+0

Nous avons un gagnant! + 1 – Moshe

1

Peut-être que vous pouvez essayer de définir la UIBarButtonItem comme une variable, puis l'affecter à la barre de boutons de navigation gauche élément, puis relâchez le bouton

Avez-vous essayez construire & Analysons dans le menu Générer? Avec 2.0 phrases Objective C c'est assez précis

en outre, vous devez faire attention à la définition de la propriété, vous utilisez self.tableView, je suppose que vous avez quelque chose comme @property (nonatomic, retenez) ?, dans ce cas Une fois que vous allouez, vous devez libérer la propriété dans la ligne suivante.

Enfin, cette ligne est extrêmement étrange: [self.tableView initWithFrame: self.tableView.frame style: UITableViewStyleGrouped]; vous essayez d'initialiser une table déjà initialisée, car si vous ne le faites pas, self.tableView.frame devrait être erroné. En plus de cela, la méthode initWithFrame renvoie quelque chose qui n'est pas affecté .. Je pense que vous pouvez penser à une meilleure façon de le faire

Désolé pour le désordre, j'ai répondu à cette question dans le chat, mais Malheureusement, vous avez été déconnecté.

Espérons que cela aide.

2

libérer Explicitement tableView dans votre méthode dealloc et voir ce qui se passe.

Ou mieux encore, propre tout -> Construire et analyser, dites-nous ce que vous voyez

+0

Merci pour ce bon conseil. Cela fonctionne parfois, mais pas toujours. – Moshe

+0

Si je libère tableView, il se bloque la prochaine fois que j'essaye de le charger. – Moshe

+0

Moshe vous allez devoir poster plus de code afin que quelqu'un puisse vous aider. Ce que vous nous montrez est un problème de base de rétention d'objet. Si vous avez encore des problèmes après cela, alors il pourrait y avoir beaucoup d'autres choses. –