IOS 8.3中的UIDatePicker内存泄漏

在运行IOS 8.3的iPad上的popup窗口中使用UIDatePicker时,会看到内存泄漏。 每次当dateselect器popup,然后解散时,我会在多次内存泄漏中获得大约5K的内存。 泄露的对象是NSDateComponents,并且负责的框架是[_UIDatePickerMode _yearlessYearForMonth:]。

我已经写了一个简单的testing应用程序来演示这个问题( https://github.com/david-ape/datepickertest/ )。 我已经包含一个UIPopoverController选项和一个UIPopoverPresentationController选项,但似乎并不重要。

我做错了什么,还是有解决方法,或者我需要等待苹果的修复? 如果是后者,那么是否有人可以build议我可以使用第三方控件来代替UIDatePicker?

以下是我用来popupdate选取器的代码。

头文件

#import <UIKit/UIKit.h> @interface ViewController : UIViewController <UIPopoverControllerDelegate, UIPopoverPresentationControllerDelegate> @end 

实施文件

 #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