mkto
mkto

Reputation: 4665

Using dequeueReusableCellWithIdentifier does not appear faster (or lower memory)?

When I want to create a table with custom cells, this is how I will write the standard codes:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CustomCell";
    CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    else
    {
        NSLog(@"reuse!");
    }

    cell.property1 = ....
    cell.property2 = ....
    return cell;
} 

This is roughly how I will create the custom cells:

I have been doing this for sometime but today I finally decided to do a test to see if the table is really reusing the cells correctly.

Nope. The table is NOT reusing any cell!. The NSLog(@"reuse!") in the code snippet above is never triggered.

I decided to do a performance comparisons, with a tableview with 1 million cells, using these two methods:

Method #1 used the method described above. Take note that UIView is the top level view in my CustomCell.xib and no reuse identifier is configured on xib

Method #2 uses a UITableViewCell in the top level of the xib, and I put all my controls on the content view of this UITableViewCell. In the XIB, I configured the reuse identifier of this cell to be 'CustomCell'.

Two questions:

  1. Why am i not seeing much lower CPU and memory usage on method #2, isn't method #1 wrong and method #2 right because method #1 is not reusing any cell at all? Or looking from another point of view, why method #1 is still scrolling so well even though it is stupidly loading nib again and again?

  2. When creating a custom xib for a custom cell, does it make any difference whether the top level object is a UIViewnor UITableViewCell? (Looks like no difference?)

Upvotes: 0

Views: 491

Answers (2)

Avt
Avt

Reputation: 17043

It seems that reuseIdentifier is not set properly in your XIB file.

You can set it programmatically also by adding

[yourTable registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"CustomCell"];

somewhere before using table view. In viewDidLoad for example.

UPDATE

Question 1. If you do not set cell reuse identifier cells life circle is following:

1.It is created.

2.It is shown.

3.It is moved out of visible area.

4.It is not needed anymore so it is deleted.

If you use reuse identifier cells TYPICAL life circle is:

1.It is popped from reusable queue..

2.It is shown.

3.It is moved out of visible area.

4.It is pushed to reusable queue.

So performance difference is due to what is executed faster: create/release operation or pop/push. Memory usage should be approximately the same for both variants.

Upvotes: 4

sage444
sage444

Reputation: 5684

you need implement

-(NSString *)reuseIdentifier {

return @"CustomCell";

} 

in you cell class CustomCell, because reuseIdentifier is readonly property you can't set it from outside

Upvotes: 1

Related Questions