По сути, вы можете передать любой отдельный объект (который сам может быть массивом или словарем, если вам нужна такая гибкость, но вы, конечно, должны иметь возможность передавать это внутри вызываемой функции.
Причина, по которой я оставляю этот ответ, состоит в том, чтобы упомянуть ловушку, которая вызывала у меня часы разочарования при использовании этого. Если вы оставите двоеточие после имени селектора, приложение будет скомпилировано, но во время выполнения произойдет сбой.
Чтобы использовать предыдущий пример
[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]];
"mySelector:" нужно двоеточие.
Ладно, может быть, это мелочь, и она очевидна для хардкорных кодеров, но мне потребовалось много времени, чтобы отладить это. Если ваш код дает сбой, а передаваемый вами объект действителен, то, вероятно, селектор - нет.