Я разрабатываю приложение (iPad, Xcode 4.6, iOS 6.x) с модальным окном, а UIProgressView обновляется в основном потоке, который показывает две утечки памяти, когда задача, контролируемая UIProgressView завершен. Если я удалю UIProgressView и вызовы потоков из кода, утечка не появится. Я попробовал это как с созданным вручную UIProgressView, так и с одним в StoryBoard. Программа использует ARC.Утечки UIProgressView (WebThreadCurrentContext & GetContextStack)
Два утечки: WebCore/WebThreadCurrentContext [Malloc 16 байт] и UIKit/GetContextStack [Malloc 64 байта].
@interface KICreateImportFileViewController()
...
@property (strong, nonatomic) UIProgressView *convertedRecordsProgressView;
@end
@implementation KICreateImportFileViewController
- (void)viewDidLoad
{
[super viewDidLoad];
...
// config the UIProgressView
CGRect pFrame = CGRectMake(20, 100, 500, 9);
self.convertedRecordsProgressView = [[UIProgressView alloc] initWithFrame:pFrame];
self.convertedRecordsProgressView.progressViewStyle = UIProgressViewStyleDefault;
[self.view addSubview:self.convertedRecordsProgressView];
}
- (void)viewDidAppear:(BOOL)animated
{
// listen for a NSNotification with info regarding process from class KITestParser
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(updateProgressViewWhenNotified:)
name:@"KITestParser:Progress Updated"
object:self.originalFile.testParser];
// Begin the background process that will update the UIProgressView
[self performSelectorInBackground:@selector(createImportFileInBackground:) withObject:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewWillDisappear:animated];
}
#pragma mark - Notifications
-(void)updateProgressViewWhenNotified:(NSNotification *)notification
{
NSNumber* progress = (NSNumber *)[notification.userInfo valueForKey:@"progressRatio"];
[self updateProgressViewOnMainThread:progress];
}
#pragma mark - Private class methods
- (void)createImportFileInBackground:(id)obj
{
// Background processes aren't automatically protected by ARC unless you wrap the function in the auto-release pool.
@autoreleasepool {
[self.originalFile createImportFile];
}
}
- (void)updateProgressViewOnMainThread:(NSNumber *)progress
{
[self performSelectorOnMainThread:@selector(updateProgressView:) withObject:progress waitUntilDone:NO];
}
- (void)updateProgressView:(NSNumber *)progress
{
[self.convertedRecordsProgressView setProgress:[progress floatValue] animated:YES];
}
@end
Вопрос 1: Есть ли все методы, которые вызываются из createImportFileInBackground: нужно быть завернуты в @autoreleasepool {}. Если это так, включают ли методы другого класса, отправляющие уведомления этому классу?
Вопрос 2: Я пропускаю то, что вызывает утечки?
Любая помощь/предложение будут оценены. Заранее спасибо! Тим
Спасибо, однако, я вижу, что примерно через 15 минут (я предполагаю, что когда бассейн очищает вещи), приложение завершает работу, то есть без каких-либо других действий с моей стороны (позволяя приложению оставаться бездействующим). Сбой происходит, если я использую инструменты или нет. Если это сохранится, я отправлю ошибку. –