2010-02-25 5 views
0

Je déclare une classe Skin en tant que variable sur mon AppDelegate. Je ne l'ai jamais assigné là-bas mais plus tard dans l'application c'est comme si le pointeur avait été réutilisé par un autre code. J'ai plusieurs déclarations mais pour une raison quelconque l'élément toolBarTint semble être réaffecté (aléatoirement) d'un type différent lorsque j'utilise le débogueur au point d'utilisation plus tard dans mon application, dans le cas actuel UISectionRowData (mais change à chaque fois) . Je ne cède pas à n'importe où ailleurs dans mon application.La propriété de classe change le type sans affectation

@interface Skin : NSObject { 
    UIColor *navigationTint; 
    UIColor *searchBarTint; 
    UIColor *toolBarTint; 
    UITableViewStyle tableViewStyle;  
    CGFloat tableViewCellHeight; 
    UIColor *tableViewBackgroundColour; 
    MKPinAnnotationColor *pinColour; 
    NSString * locationViewFontName; 
    CGFloat locationViewFontSize; 
} 

@property (nonatomic,assign) UIColor *navigationTint; 
@property (nonatomic,assign) UIColor *searchBarTint; 
@property (nonatomic,assign) UIColor *toolBarTint; 
@property (nonatomic,assign) UITableViewStyle tableViewStyle; 
@property (nonatomic,assign) CGFloat tableViewCellHeight; 
@property (nonatomic,assign) UIColor *tableViewBackgroundColour; 
@property (nonatomic,assign) MKPinAnnotationColor *pinColour; 
@property (nonatomic,retain) NSString * locationViewFontName; 
@property (nonatomic,assign) CGFloat locationViewFontSize; 

@end 

- délégué App définir la peau

  skin = [[Skin alloc] init]; 

    skin.navigationTint = [UIColor colorWithRed:((float) 154/255.0f) green:((float) 98/255.0f) blue:((float) 176/255.0f) alpha:1.0f]; 
    skin.searchBarTint = [UIColor colorWithRed:((float) 154/255.0f) green:((float) 98/255.0f) blue:((float) 176/255.0f) alpha:1.0f]; 
    skin.toolBarTint = [UIColor colorWithRed:((float) 154/255.0f) green:((float) 98/255.0f) blue:((float) 176/255.0f) alpha:1.0f]; 
    skin.tableViewStyle = UITableViewStyleGrouped; 
    skin.tableViewCellHeight = 60.0; 
    skin.tableViewBackgroundColour = [UIColor colorWithRed:((float) 154/255.0f) green:((float) 98/255.0f) blue:((float) 176/255.0f) alpha:1.0f]; 
    skin.pinColour = MKPinAnnotationColorRed; 
    skin.locationViewFontName = @"Helvetica"; 
    skin.locationViewFontSize = 15.0f; 

Répondre

4

[UIColor colorWithRed:...] renvoie autoreleased objet afin que sa validité ne soit pas garantie en dehors de la portée où vous l'avez créé. Vous devez conserver l'objet pour une utilisation ultérieure (définissez la propriété avec l'attribut retain au lieu d'assigner et n'oubliez pas de libérer vos ivars dans la méthode dealloc).
Ce qui s'est passé dans votre cas - votre objet toolBarTint a été finalement libéré et la mémoire a été occupée par un autre objet.

0

Avez-vous essayé d'ajouter un observateur du champ toolBartTint:

[skin addObserver:self forKeyPath:@"toolBarTint" options: NSKeyValueObservingOptionNew context:NULL]

Ensuite, dans votre délégué il suffit d'ajouter la méthode d'observation:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { }

2

Oui, je fais écho à ce qui a été dit plus haut et cela s'applique également aux autres propriétés. Je suggérerais d'ajouter [... retain] autour de chacune de ces expressions d'assignation ou de changer l'attribut dans la déclaration de propriété pour le conserver au lieu de l'assigner. N'oubliez pas non plus de les nettoyer dans votre méthode dealloc en relâchant chacun d'eux. En règle générale, les API Cocoa-Touch suivent la convention des méthodes (+ classNameWith ...) retournant les objets auto-libérés que vous devez conserver explicitement pour rester au-delà de la portée du corps de la méthode. Cela signifie que tout appel de méthode d'usine comme colorWith ... stringWith ... urlWith ... retournera un objet auto-publié. Cependant, si vous allouez/init l'objet, il sera implicitement conservé.

+0

+1 pour 'retain' au lieu de' assign' –

Questions connexes