2013-03-01 3 views
0

Я разрабатываю приложение (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: Я пропускаю то, что вызывает утечки?

Любая помощь/предложение будут оценены. Заранее спасибо! Тим

ответ

0

Простой ответ: вы используете ARC, не беспокойтесь об этом.

Разработано: Я видел это с каждым проектом ARC, который у меня когда-либо был. Инструмент утечки идентифицирует утечки в коде рамки. Действительно ли они протекают? Является ли инструмент ложными срабатываниями? Ответ: Кому это нужно. Даже если бы вы знали, были ли они настоящей утечкой или нет, лучшим решением, которое вы могли бы сделать, было бы подать ошибку с яблоком. У вас нет никакого обращения, никаких действий, которые вы можете предпринять. Забудь об этом.

+0

Спасибо, однако, я вижу, что примерно через 15 минут (я предполагаю, что когда бассейн очищает вещи), приложение завершает работу, то есть без каких-либо других действий с моей стороны (позволяя приложению оставаться бездействующим). Сбой происходит, если я использую инструменты или нет. Если это сохранится, я отправлю ошибку. –

 Смежные вопросы

  • Нет связанных вопросов^_^