Несколько каналов с MWFeedParser, помогите с кодом - PullRequest
1 голос
/ 08 сентября 2011

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

Код:

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 Ответ

1 голос
/ 08 сентября 2011

Лучше всего добавить их в массив, а затем 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];
}
...