类'属性更改类型没有赋值

时间:2010-02-25 14:32:37

标签: iphone objective-c

我在我的AppDelegate上声明一个Skin类作为变量。我只在那里分配它,但稍后在应用程序中它就好像指针已经被其他代码重用了。

我有各种声明但由于某种原因,在我的应用程序中稍后使用调试器时,在当前情况下UISectionRowData(但每次都更改)时,item toolBarTint似乎被重新分配(随机)不同的Type。我没有分配给我的应用程序中的任何其他地方。

@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

- App委托定义皮肤

            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 个答案:

答案 0 :(得分:4)

[UIColor colorWithRed:...]会返回自动释放的对象,因此无法保证在您创建它的范围之外的有效性。您必须保留对象供以后使用(使用retain属性定义属性而不是分配,不要忘记在dealloc方法中释放您的ivars)。
在您的情况下发生了什么 - 您的toolBarTint对象最终被释放,然后内存被其他一些对象占用。

答案 1 :(得分:2)

是的我回应上面所说的内容,它也适用于其他属性。我建议在每个赋值表达式周围添加[... retain]或者在属性声明中切换属性以保留而不是赋值。另外,不要忘记通过释放每个方法来清除这些方法。一般来说,Cocoa-Touch API遵循(+ classNameWith ...)方法的约定,返回自动释放的对象,您必须明确保留这些对象以超出方法体范围。这意味着任何工厂方法调用如colorWith ... stringWith ... urlWith ...将返回一个自动释放的对象。但是,如果您分配/初始化对象,它将被隐式保留。

答案 2 :(得分:0)

您是否尝试为toolBartTint字段添加观察者:

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

然后在你的委托中添加观察者方法:

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