Утечка пользовательских ячеек - PullRequest
0 голосов
/ 02 апреля 2012

У меня проблема с утечкой пользовательских ячеек.

В моем переопределенном контроллере UITableViewController,

- (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     TwitterTweetTableCell *cell = nil;

     // Obtain the cell...

    cell = [[TwitterTweetTableCell alloc]
            initWithTable:tableView
                andTweet:[[self getTimeline] objectAtIndex:indexPath.row]];

    return [cell autorelease];
}

И в соответствующем переопределенном классе UITableViewCell,

- (TwitterTweetTableCell *) initWithTable:(UITableView *) tableView
    andTweet:(NSDictionary *) tweet
{

    tweetCell = nil;

    // ************************************************************************************
    // The identifier used in the following dequeue is the one set in the corresponding nib
    // ************************************************************************************

    tweetCell = (TwitterTweetTableCell *)
        [tableView dequeueReusableCellWithIdentifier:@"tweetCell"]; // <-- set this in NIB

    if (tweetCell)
    {
        NSLog(@"tweetCell: Reuse!");
    }

    if(!tweetCell)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle]
                loadNibNamed:@"TwitterTweetTableCell" owner:nil options:nil];

        for(id currentObject in topLevelObjects)
        {
            if([currentObject isKindOfClass:[TwitterTweetTableCell class]])
            {
                tweetCell = (TwitterTweetTableCell *)currentObject;

                break;
            }
        }

        // yadda, yadda, yadda

        [tweetCell retain];
    }

    return tweetCell;
}

Существует соответствующий NIB для пользовательской ячейки (TwitterTweetTableCell), и, как отмечено в коде, Идентификатор для ячейки там установлен как 'tweetCell'.

Код работает нормально, за исключением того, что, согласно Инструментам, он пропускает ячейки: - (

Я полагаю, что я прав, возвращая ячейку с retainCount, равным 1 (это возврат от alloc и, в любом случае, если я этого не сделаю, то он вылетает с зомби). Как показывает код, я затем автоматически освобождаю его, прежде чем передать его контроллеру стола.

Мысли о том, почему это утечки будут оценены.

1 Ответ

0 голосов
/ 02 апреля 2012

Проблема здесь в том, что в cellForRowAtIndexPath: вы выделяете память для нового экземпляра вашей пользовательской ячейки, но в инициализаторе для вашей пользовательской ячейки вы фактически никогда не используете эту память, которую вы выделяете, поскольку вы не возвращаете self, и вместо этого вернуть существующую многократно используемую ячейку или создать новую из пера.

Поскольку вы initWithTable:andTweet: метод на самом деле не инициализатор, вы должны просто изменить его на удобный метод, который вместо этого возвращает автоматически высвобожденные экземпляры. Измените подпись метода,

+ (TwitterTweetTableCell *) cellWithTable:(UITableView *) tableView
andTweet:(NSDictionary *) tweet

заставить его автоматически выпустить возвращаемое значение,

return [tweetCell autorelease];

, а затем сделайте немного другой вызов в cellForRowAtIndexPath:, и все будет готово:

return [TwitterTweetTableCell cellWithTable:tableView
                                   andTweet:[[self getTimeline] objectAtIndex:indexPath.row]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...