其实有两种模式:
旧型号
这些模型是 Objective-C 2.0 之前的模型,继承自 Mac OS X。它仍然有效,但你不应该声明属性来修改 ivars。那就是:
@interface StrokeWidthController : UIViewController {
IBOutlet UISlider* slider;
IBOutlet UILabel* label;
IBOutlet StrokeDemoView* strokeDemoView;
CGFloat strokeWidth;
}
@property (assign, nonatomic) CGFloat strokeWidth;
- (IBAction)takeIntValueFrom:(id)sender;
@end
在此模型中,您不保留 IBOutlet ivars,但您必须释放它们。那就是:
- (void)dealloc {
[slider release];
[label release];
[strokeDemoView release];
[super dealloc];
}
新模型
您必须为 IBOutlet 变量声明属性:
@interface StrokeWidthController : UIViewController {
IBOutlet UISlider* slider;
IBOutlet UILabel* label;
IBOutlet StrokeDemoView* strokeDemoView;
CGFloat strokeWidth;
}
@property (retain, nonatomic) UISlider* slider;
@property (retain, nonatomic) UILabel* label;
@property (retain, nonatomic) StrokeDemoView* strokeDemoView;
@property (assign, nonatomic) CGFloat strokeWidth;
- (IBAction)takeIntValueFrom:(id)sender;
@end
另外你必须释放dealloc中的变量:
- (void)dealloc {
self.slider = nil;
self.label = nil;
self.strokeDemoView = nil;
[super dealloc];
}
Furthermode,在非脆弱平台中,您可以删除 ivars:
@interface StrokeWidthController : UIViewController {
CGFloat strokeWidth;
}
@property (retain, nonatomic) IBOutlet UISlider* slider;
@property (retain, nonatomic) IBOutlet UILabel* label;
@property (retain, nonatomic) IBOutlet StrokeDemoView* strokeDemoView;
@property (assign, nonatomic) CGFloat strokeWidth;
- (IBAction)takeIntValueFrom:(id)sender;
@end
奇怪的事情
在这两种情况下,出口都是通过调用 setValue:forKey: 来设置的。运行时内部(特别是 _decodeObjectBinary)检查 setter 方法是否存在。如果它不存在(只有 ivar 存在),它会向 ivar 发送一个额外的保留。因此,如果没有 setter 方法,则不应保留 IBOutlet。