@property未设置为新值

时间:2012-02-16 18:26:23

标签: objective-c ios cocoa-touch

我有一个类作为模型 - 过滤器。我需要从我的控制器访问这个模型。 Filter.h

@interface Filter : NSObject

@property (nonatomic, assign) BOOL name;

@end

在我的控制器中:

@implementation NavigationController

@synthesize filter = _filter;

- (IBAction)setVirtualShowProperty:(UISwitch*)sender {
    self.filter.virtualRoomSet = YES; 
    _filter.virtualRoomSet = YES; // I dont know which syntax is better
    }
@end

但它没有更新virtualRoomSet它仍然是'NO'。虫子在哪里?感谢

2 个答案:

答案 0 :(得分:1)

再展示一下您的过滤器实现。可能会有很多因素导致财产无法设置。最值得注意的是,它不在您的公共界面中。

@interface Filter : NSObject

@property (nonatomic, assign) BOOL name;
@property (nonatomic, assign) BOOL virtualRoomSet;

@end

把它放在那里不会有什么不同,但它应该使对象的意图更清楚。关于您的控制器实现:

#import "Filter.h"

@implementation NavigationController

@property (nonatomic, retain) Filter *filter;

@end

@implementation NavigationController

@synthesize filter;

//assuming you've properly alloced in init...

-(void) dealloc
{
   [filter release];
   [super dealloc];
}

- (IBAction)setVirtualShowProperty:(UISwitch*)sender {
    self.filter.virtualRoomSet = YES; //better syntax as dealing directly w/ iVars is error prone

}
@end

使用属性而不是直接访问iVars会减少您必须编写的内存管理代码量,并且可以根据需要替换具有协作对象的iVars。我通常会避免一起声明iVars,因为它们现在是隐含的假设。这让你远离“@synthesize myVar = _myVar”;丑陋。

如果你的过滤器中有这样的东西:

@interface Filter : NSObject {
    BOOL _virtualRoomSet;
}

@property (nonatomic, assign) BOOL name;
@property (nonatomic, assign) BOOL virtualRoomSet;

@end

这在您的过滤器实现中:

@implementation Filter
@synthesize filter;

//other code

@end

...它可以解释这个错误,这进一步强调了我上面关于避免声明iVars的观点!换句话说,请确保您实际上正在设置要设置的内容。现在,对于iOS SDK 3.0或更早版本,所有属性都会自动声明隐式iVar。经验法则,在代码中杀死iVars并仅处理属性。

答案 1 :(得分:0)

看起来你正在调用setVirtualShowProperty:在调用navigationController.filter = someFilter;。

之前

你将布尔值设置为YES并且仍然看到它是NO的事实是误导性的 - 它不是真的没有,只是你设置它的对象可能是零。

当你到达setVirtualShowProperty时,你应该确保你的navigationController.filter对象确实不是nil。: