我在模态视图演示中遇到了同样缓慢的性能。我通过牺牲一些内存来提高性能来找到解决方案。
背景:
我的应用程序使用的是 Model-View-Controller-Store 模型。Store 是一个处理我的模型的单例,因此一旦实例化,它几乎可以从我的任何类中访问。我使用 Store 类通过属性来避开某些昂贵的类(例如 NSCalendar、NSDateFormatter 等)。
解决方案:
我在 Store 单例中创建了一个 UIDatePicker 属性,它允许通过任何类访问它。
在 Singleton 的界面中:
@property (strong, nonatomic) UIDatePicker *datePicker;
在 Singleton 的实现中,我为 datePicker 实现了一个 getter。
- (UIDatePicker *)datePicker
{
if (!_datePicker) {
_datePicker = [[UIDatePicker alloc] init];
}
return _datePicker;
}
这确保了 datePicker 只被创建一次,并且可以从我的应用程序的任何地方访问它。
现在在需要使用选取器的类的 viewDidLoad 方法中,通过 getter 方法获取属性:
UIDatePicker *aDatePicker = [[MySingleton shareInstance] datePicker];
// Set it's location.
[aDatePicker setFrame:CGRectMake(0.0, 236.0, self.view.frame.size.width, 216.0)];
// Connect to any actions
[aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
// Add it to you view
[self.view addSubview:[[MySingleton shareInstance] datePicker]];
缓慢的行为将在创建日期选择器时第一次发生。每隔一段时间,模态视图就会以极快的速度出现(取决于视图中的其他内容)。
本质上,我是在创建一个全局变量并保留它,这样我就不必每次都以内存为代价创建它。在我的应用案例中,性能差异使其值得。
注意:
有一个警告需要注意。由于 datePicker 很可能比模态视图更长寿,因此必须确保 datePicker 没有指向任何已释放的内存。
因此,如果在 viewDidLoad 中将“self”指定为目标:
[aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
重要的是,在 viewDidDisappear 等方法中添加此代码以防止崩溃:
[aDatePicker removeTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];