2011-09-08 6 views
1

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

Код:

for (NSString *imePredmeta in [Data variables].mojiPredmeti) { 
     NSString *link = [[Data variables].rss objectForKey: imePredmeta]; 
     NSURL *feedURL = [NSURL URLWithString: link]; 
     feedParser = [[MWFeedParser alloc] initWithFeedURL:feedURL]; 
     feedParser.delegate = self; 
     feedParser.feedParseType = ParseTypeFull; // Parse feed info and all items 
     feedParser.connectionType = ConnectionTypeAsynchronously; 
     [feedParser parse];   
    } 

Dealloc:

- (void)dealloc { 
    [formatter release]; 
    [parsedItems release]; 
    [itemsToDisplay release]; 
    [feedParser release]; 
    [super dealloc]; 
} 

И initWithFeedUrl из MWFeedParser код:

- (id)initWithFeedURL:(NSURL *)feedURL { 
    if ((self = [self init])) { 

     // Check if an string was passed as old init asked for NSString not NSURL 
     if ([feedURL isKindOfClass:[NSString class]]) { 
      feedURL = [NSURL URLWithString:(NSString *)feedURL]; 
     } 

     // Remember url 
     self.url = feedURL; 

    } 
    return self; 
} 

ответ

1

Лучше всего было бы, чтобы добавить их в массив, а затем в dealloc релиз этого массива.

// declare an iVar in your header file 
NSMutableArray *feeds; 

// instantiate the array, but release it first as you may call your method more 
// than once 
if (feeds) { 
    [feeds release]; 
} 
feeds = [[NSMutableArray alloc] init]; 
for (NSString *imePredmeta in [Data variables].mojiPredmeti) { 
    ... 
    // after calling parse on the feed, add it to the array and then release it. 
    // Objects added to an array are retained by the array so this is safe 
    [feedParser parse]; 
    [feeds addObject:feedParser]; // <-- Add parser to array 
    [feedParser release]; // <-- Release parser 
} 

// then in your dealloc simply release the array, which will in-turn release all 
// the parser objects it contains 
- (void)dealloc { 
    [formatter release]; 
    [parsedItems release]; 
    [itemsToDisplay release]; 
    [feeds release]; // <-- Release feeds array 
    // I've removed the call to release feedParser as it's already been released 
    [super dealloc]; 
} 
+0

Нравится? http://pastebin.com/YuH7b9hB – vburojevic

+0

Да, точно так же :) Не забудьте удалить строку '[feedParser release';' строка из вашего 'dealloc' или вы создадите сбой. –

+0

Хорошо, кажется, утечек нет! :) Но еще одна проблема, когда таблица пуста (без фидов), и когда я нажимаю кнопку «Обновить», приложение вылетает, как это решить? Это из-за [releaseParser release]; потому что он не существует, я думаю? – vburojevic