views:

77

answers:

1

I have tried to run the following code, as a proof of concept, and I get the following error:

  *** -[UIAnimator count]: unrecognized selector sent to instance 0x3832610
  2009-10-09 00:33:22.355 Concept1[680:207] *** Terminating app due to uncaught exception
 'NSInvalidArgumentException', reason: '*** -[UIAnimator count]: unrecognized selector sent to
  instance 0x3832610'

This exception seems to refer to a variable I have previously defined as a NSArray (i.e. the variable 'keys') so I am confused as to why it now seems to have changed to a UIAnimator. It is also frustrating that I cannot find any documentation on UIAnimator.

Commenting out the release of the temporary array used to assign to 'keys' in the viewDidLoad method makes the code run but I fail to understand why...wouldn't the failure to release 'array' cause a leak as this object has ownership of it?

I would be extremely grateful for any help anyone could provide as it is 1am and I've run out of ideas as to what could be causing this behaviour.

Anyway, here is the code:

#import "MyViewController.h"


@implementation MyViewController

@synthesize names;
@synthesize keys;

/*
- (id)initWithStyle:(UITableViewStyle)style {
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    if (self = [super initWithStyle:style]) {
    }
    return self;
}
*/


- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"My Details";

    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"David", @"First Name", @"Johnson", @"Last Name", nil];

    self.names = dic;

    [dic release];

    NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];


    self.keys = array;


    [array release]; //if this is commented out then the code works. why? won't this leak?

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.names = nil;
    self.keys = nil;
}


#pragma mark Table view methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [keys count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSInteger row = [indexPath row];

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell...
    cell.textLabel.text = [names objectForKey:[keys objectAtIndex:row]];
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
    // [self.navigationController pushViewController:anotherViewController];
    // [anotherViewController release];
}



- (void)dealloc {
    [names release];
    [keys release];
    [super dealloc];
}


@end
+2  A: 

You don't own the result of sortedArrayUsingSelector:, so you must not release it. The release cancels out the ownership you gained by doing self.keys = array, meaning it's OK for the array to go away.

Check out Apple's memory management rules for more info.

Chuck
Thank you for that. I can't believe what an idiot I was being. No alloc = no ownership. I knew that but I was completely blind to the problem when checking through the code. Thank you again for putting me on the right path :)
Urizen