2010-03-07 7 views
0

---- MyEventSelectorCell.hUIImageView EXC_BAD_ACCESS

@interface MyEventSelectorCell : UITableViewCell { 
    IBOutlet UIImageView* eventImage; 
} 

@property(nonatomic, retain) IBOutlet UIImageView* anImage; 

----- MyEventSelectorCell.m

-(id) dealloc { 
    [anImage release];// < -- If I comment this out, It starts leaking, but program runs fine... 
} 

---- MyTableViewController.h

@MyTableViewController: UIViewController<UITableViewDelegate> { 
    IBOutlet MyEventSelectorCell* tmpCell; 
} 

@property(nonatomic, retain) IBOutlet MyEventSelectorCell* tmpCell; 

- - MyTableViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

... 

    [[NSBundle mainBundle] loadNibNamed:@"MyEventSelectorCell" owner:self options:nil]; 
    tmpCell.anImage.image = [UIImage imageNamed: @"someimage.png"]; 

... 

} 

EXC_BAD_ACCESS arrive après que je libère ANIMAGE lors de la mise la propriété du UIImageView à imageNamed ci-dessus ...

+0

Vous devez ajouter [super dealloc] à la fin de votre dealloc. Normalement, dealloc renvoie un vide; vous avez déclaré retourner l'identifiant mais ne l'avez pas renvoyé. Votre compilateur lance toutes sortes d'avertissements que vous ignorez. – Giao

Répondre

3

[UIImage imagedNamed: ...] retourne un objet autorelease. Donc, si vous relâchez trop vous devez conserver explicitement:

tmpCell.anImage.image = [[UIImage imageNamed: @"someimage.png"] retain]; 

Espoir qui vous aide. À votre santé.

+0

Il y a une fuite de mémoire après ma solution? – reinaldoluckman

+0

Ceci est incorrect. L'objet 'UIImageView' conserve une référence forte à l'instance' UIImage', ce qui signifie qu'il n'est pas nécessaire de conserver explicitement l'instance 'UIImage'. –

1

R31n4ld0 est techniquement correct, mais comme UIImageView conserve son image, vous ne devriez pas la conserver vous-même.

Votre problème peut se produire parce que vous libérez une vue qui est conservée par une propriété avec l'attribut "retain". Les propriétés "retain" synthétisées incluent les appels implicites à libérer et à conserver dans le setter, de sorte que le pattern habituel dans dealloc consiste à leur attribuer nil au lieu d'appeler release sur la propriété elle-même. Cela empêche les appels de libération redondants lors de la réaffectation de la propriété.