Не для того, чтобы найти здесь противоположный ответ, а для дополнения ответа @ Хью.
При реализации вышеописанного метода swapController:with:
я заметил некоторые проблемы с ARC и примитивами. ARC станет проблемой, если вы передадите сильный идентификатор * на идентификатор * (который будет обозначен как идентификатор autoreleased и другие забавные предупреждения).
Если вы похожи на меня, то в один прекрасный день вы будете обмениваться указателями назад и вперед в objc, и одно из этих значений будет примитивным типом данных.
Если в конечном итоге вы сделаете что-то подобное, вот небольшой помощник (как я уже говорил ранее), чтобы дополнить ответ выше:
void swapObjcPointerWithC ( void** ptrA, void** ptrB ) {
void *temp = *ptrA;
*ptrA = *ptrB;
*ptrB = temp;
}
...
// Later on
id objA;
int anInt = 10;
swapObjcPointerWithC ( (void*)&objA, (void*)&anInt );
Вот, пожалуйста. Мои два цента.
Примечание: также работает, по-видимому, ноль указателей.