Я никогда не видел, чтобы синтаксис передавал более одного объекта селектору - это действительный код target-c? также, в вашем startDownloadFor: atIndex: вы передаете NSNumber, но тип для второго параметра в этом селекторе - (int) - это не может быть хорошим;)
Документы для executeSelectorOnMainThread : говорят, что селектор должен принимать только один аргумент типа id. Вы передаете недопустимый селектор, поэтому я думаю, что он очень запутан в том, где находится NSNumber.
Чтобы исправить это, передайте NSDictionary, содержащий число и URL-адрес изображения, т.е.
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:imageURL, @"imageURL", [NSNumber numberWithInt:i], @"number", nil];
[self performSelectorOnMainThread:@selector(startDownload:) withObject:dict waitUntilDone:YES];
и
//-(void)startDownloadFor:(NSString*)imageUrl atIndex:(int)indexPath{
- (void)startdownload:(NSDictionary *)dict {
NSURL *imageURL = [dict objectForKey:@"imageURL"];
int indexPath = [[dict objectforKey:@"number"] intValue];