iPhone - how to use performSelector with complex parameters?

cocoa, ipad, iphone, iphone-sdk-3.0

Solution

Use `NSInvocation`.

 NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:
                        [cell methodSignatureForSelector:
                         @selector(initWithFrame:reuseIdentifier:)]];
 [invoc setTarget:cell];
 [invoc setSelector:@selector(initWithFrame:reuseIdentifier:)];
 CGRect arg2 = CGRectZero;
 [invoc setArgument:&arg2 atIndex:2];
 [invoc setArgument:&myIdentifier atIndex:3];
 [invoc invoke];

Alternatively, call `objc_msgSend` directly (skipping all the unnecessary complex high-level constructs):

cell = objc_msgSend(cell, @selector(initWithFrame:reuseIdentifier:), 
                    CGRectZero, myIdentifier);

Problem

I have an application designed for iPhone OS 2.x. At some point I have this code ``` - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //... previous stuff initializing the cell and the identifier cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:myIdentifier] autorelease]; // A // ... more stuff } ``` But as the initWithFrame selector was deprecated in 3.0, I need to transform this code using respondToSelector and performSelector... as this... ``` if ( [cell respondsToSelector:@selector(initWithFrame:)] ) { // iphone 2.0 // [cell performSelector:@selector(initWithFrame:) ... ???? what? } ``` My problem is: how can I break the call on A into preformSelector calls if I have to pass two parameters "initWithFrame:CGRectZero" and "reuseIdentifier:myIdentifier" ??? EDIT - As sugested by fbrereto, I did this ``` [cell performSelector:@selector(initWithFrame:reuseIdentifier:) withObject:CGRectZero withObject:myIdentifier]; ``` The error I have is "incompatible type for argument 2 of 'performSelector:withObject:withObject'. myIdentifier is declared like this ``` static NSString *myIdentifier = @"Normal"; ``` I have tried to change the call to ``` [cell performSelector:@selector(initWithFrame:reuseIdentifier:) withObject:CGRectZero withObject:[NSString stringWithString:myIdentifier]]; ``` without success... The other point is CGRectZero not being an object...

Original source