Свойство класса меняет тип без присваивания - PullRequest
0 голосов
/ 25 февраля 2010

Я объявляю класс Skin в качестве переменной на моем AppDelegate. Я назначаю его только там, но позже в приложении, как если бы указатель использовался другим кодом.

У меня есть различные объявления, но по какой-то причине элемент toolBarTint, по-видимому, переназначается (случайным образом) другому типу при использовании отладчика на этапе использования позже в моем приложении, в текущем случае UISectionRowData (но изменяется каждый раз). Я не назначаю нигде в моем приложении.

@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

- Определить скин приложения для делегата

            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;

Ответы [ 3 ]

4 голосов
/ 25 февраля 2010

[UIColor colorWithRed:...] возвращает автоматически выпущенный объект, поэтому его действительность не гарантируется вне области, в которой вы его создали. Вы должны сохранить объект для последующего использования (определите свойство с атрибутом сохранения вместо назначения и не забудьте освободить свои ивары в методе dealloc).
Что произошло в вашем случае - ваш toolBarTint объект был в конечном итоге освобожден, а затем память была занята другим объектом.

2 голосов
/ 25 февраля 2010

Да, я повторяю сказанное выше, и это относится и к другим свойствам. Я бы предложил добавить [... retain] вокруг каждого из этих выражений присваивания или переключить атрибут в объявлении свойства, чтобы сохранить вместо assign. Также не забудьте очистить их в вашем методе dealloc, выпуская каждый из них. Вообще говоря, API-интерфейсы Cocoa-Touch следуют соглашению методов (+ classNameWith ...), возвращающих автоматически высвобождаемые объекты, которые вы должны явно сохранять, чтобы не выходить за рамки тела метода. Это означает, что любой вызов метода фабрики, такой как colorWith ... stringWith ... urlWith ... вернет автоматически освобожденный объект. Однако если вы выделите / инициализируете объект, он будет неявно сохранен.

0 голосов
/ 25 февраля 2010

Вы пытались добавить наблюдателя для поля toolBartTint:

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

Затем в вашем делегате просто добавьте метод наблюдателя:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...