Функция для обмена указателями в Objective-C - PullRequest
0 голосов
/ 15 июня 2010
- (void) swapController:(MyViewController*)controller1 
                         with:(MyViewController*)controller2
{
    MyViewController *swap = controller2;
    controller2 = controller1;
    controller1 = swap;
}

Похоже, это не работает, потому что я не передаю ссылки.Как это сделать?

Ответы [ 2 ]

7 голосов
/ 15 июня 2010

Вы можете сделать это, передав указатели, которые вы хотите изменить:

- (void)swapController:(MyViewController**)controller1 with:(MyViewController**)controller2
{
    MyViewController* swap = *controller2;
    *controller2 = *controller1;
    *controller1 = swap;
}
4 голосов
/ 11 декабря 2012

Не для того, чтобы найти здесь противоположный ответ, а для дополнения ответа @ Хью.

При реализации вышеописанного метода 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 );

Вот, пожалуйста. Мои два цента. Примечание: также работает, по-видимому, ноль указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...