2010-09-11 2 views
1

Я создаю экран загрузки UIView, который добавляется в подвью, в то время как некоторый XML анализируется с некоторого URL. После возвращения XML экран загрузки удаляется из своего супервизора.Когда выпустить UIView, который удален из супервизора

Вопрос, который у меня есть, это как я могу освободить этот объект?

В приведенном ниже коде вы увидите, что я посылаю removeFromSuperview на экран загрузки, но у меня все еще есть право владения этим объектом, если я его не выпустлю. Но, если я его отпущу, там нечего будет выпускать в viewdidUnload и dealloc.

- (void)loadView { 
    ... 
    loadingScreen = [[LoadingScreen alloc] initWithFrame: self.view.frame]; 
    [self.view addSubview:loadingScreen]; //retain count = 2 
} 

-(void)doneParsing { 
    ... 
    [loadingScreen removeFromSuperview]; //retain count = 1 
    [loadingScreen release]; //should i release the loading screen here? 
} 

- (void)viewDidUnload { 
    [loadingScreen release]; //if viewDidUnload is called AFTER doneParsing, this 
          //will cause an exception, but the app might crash before 
          //doneParsing is called, so i need something here 
} 

- (void)dealloc { 
    [loadingScreen release]; //if i've already released the object, i can't release here 
} 
+0

На самом деле, я решил, что решил это, выпустив загрузку экрана после добавления в качестве подвью, а затем удалив загрузку из экрана просмотра в завершающем сеансе. Я не выпускаю LoadScreen в viewDidUnload или dealloc. – dianovich

+1

Это правильно. Отдайте его супервизору, а затем отпустите его. После этого это уже не ваша ответственность, и вы можете забыть об этом. Superview выпустит его, когда супервизор будет выпущен сам. –

ответ

2

Когда вы отпускаете LoadScreen, сбросьте его до значения nil.

[loadingScreen release]; 
loadingScreen = nil; 

[nil release] ничего не произойдет.