IOS 8.3中的UIDatePicker内存泄漏
我发现UIDatePicker在运行IOS 8.3的iPad上用于popover时内存泄漏。每次日期选择器弹出然后被解除时,我都会收到大约5K的多个内存泄漏。泄漏的对象是NSDateComponents,负责的帧是[\u UIDatePickerMode\u YearlessyEarformon:] 我已经编写了一个简单的测试应用程序来演示这个问题()。我已经包括了一个UIPopoverController选项和一个UIPopoverPresentationController选项,但是使用哪一个似乎并不重要 我是做错了什么,还是有解决办法,还是需要等待苹果的修复?如果是后者,那么有人能建议我使用第三方控件来代替UIDatePicker吗 下面是我用来弹出日期选择器的代码 头文件IOS 8.3中的UIDatePicker内存泄漏,ios,objective-c,memory-leaks,Ios,Objective C,Memory Leaks,我发现UIDatePicker在运行IOS 8.3的iPad上用于popover时内存泄漏。每次日期选择器弹出然后被解除时,我都会收到大约5K的多个内存泄漏。泄漏的对象是NSDateComponents,负责的帧是[\u UIDatePickerMode\u YearlessyEarformon:] 我已经编写了一个简单的测试应用程序来演示这个问题()。我已经包括了一个UIPopoverController选项和一个UIPopoverPresentationController选项,但是使用哪一
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIPopoverControllerDelegate,
UIPopoverPresentationControllerDelegate>
@end
我有同样的问题:。似乎是错误。如果picker中有一个bug,那么每个iOS应用程序都会受到影响,因此苹果应该尽快修复它。你给他们发了这个错误吗?是的,我已经报告了。苹果要求我检查它是否在IOS 9测试版中,但不幸的是,我还没有时间这么做。顺便说一句,这个问题只会在您直接通过故事板设置选择器值时重现。我也发布了这个bug。
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIPopoverController *ios7Popover;
- (IBAction)datePickerPopupIOS7:(UIButton *)sender;
- (IBAction)datePickerPopupIOS8:(UIButton *)sender;
@end
@implementation ViewController
// helper - returns a view controller containing a date picker for use in a
// popup
+ (UIViewController *)buildDatePickerViewController
{
CGRect frame = CGRectMake(0, 0, 350, 216);
UIViewController *viewController = [[UIViewController alloc]init];
viewController.preferredContentSize = frame.size;
UIDatePicker *datepicker = [[UIDatePicker alloc]initWithFrame:frame];
datepicker.datePickerMode = UIDatePickerModeDate;
datepicker.hidden = NO;
datepicker.date = [NSDate date];
[viewController.view addSubview:datepicker];
return viewController;
}
// popup date picker using UIPopoverController (IOS7 compatible)
- (IBAction)datePickerPopupIOS7:(UIButton *)sender
{
UIViewController *viewController = [ViewController buildDatePickerViewController];
self.ios7Popover = [[UIPopoverController alloc]initWithContentViewController:viewController];
self.ios7Popover.delegate = self;
[self.ios7Popover presentPopoverFromRect:sender.frame
inView:self.view
permittedArrowDirections:(UIPopoverArrowDirectionUp|UIPopoverArrowDirectionDown| UIPopoverArrowDirectionLeft|UIPopoverArrowDirectionRight)
animated:YES];
}
// popup date picker using UIPopoverPresentationController (IOS8 or later required)
// Thanks to http://stackoverflow.com/a/26944036/1764243 for how to do this
- (IBAction)datePickerPopupIOS8:(UIButton *)sender
{
if ([UIPopoverPresentationController class])
{
UIViewController *viewController = [ViewController buildDatePickerViewController];
UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:viewController];
destNav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popover = destNav.popoverPresentationController;
popover.delegate = self;
popover.sourceView = self.view;
popover.sourceRect = [sender frame];
destNav.navigationBarHidden = YES;
[self presentViewController:destNav animated:YES completion:nil];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Not supported"
message:@"UIPopoverPresentationController not supported in this version of IOS"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
}
#pragma mark - UIPopoverControllerDelegate methods
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
self.ios7Popover = nil;
}
@end