2010-06-14 6 views
0
- (void) swapController:(MyViewController*)controller1 
         with:(MyViewController*)controller2 
{ 
    MyViewController *swap = controller2; 
    controller2 = controller1; 
    controller1 = swap; 
} 

참조를 전달하지 않기 때문에이 방법이 작동하지 않는 것 같습니다. 어쨌든 그것을하는 방법?Objective-C에서 포인터를 바꾸는 함수

+0

포인터의 값은 개체의 주소를 나타내는 정수입니다. ** swapController : with : **에 전달하면 함수 임시 변수 (스택에 있음)에 값을 전달할 뿐이며 스와핑은 이러한 임시 변수에서 수행됩니다. 함수 호출에서 포인터의 값을 변경하려면 포인터 – onmyway133

답변

7

당신은 변경할 포인터에 대한 포인터를 전달하여이 작업을 수행 할 수 있습니다

- (void)swapController:(MyViewController**)controller1 with:(MyViewController**)controller2 
{ 
    MyViewController* swap = *controller2; 
    *controller2 = *controller1; 
    *controller1 = swap; 
} 
+0

에 포인터를 전달해야합니다. 'MyViewController * c1'은'swapController : & c1'과 같은 함수에 전달됩니까? – Pablo

+0

@Michael : 맞습니다. 왜 일반 인스턴스 메소드가 두 변수를 바꿔야하는지 상상할 수는 없습니다. – Chuck

+0

@Chuck : 모든 것은 var 이름입니다. – Pablo

4

여기에 반대 응답으로이 찾고있는 것이 아니라 Huw의 대답 @ 보완 할 수 없습니다.

위의 그의 swapController:with: 메서드를 구현할 때 ARC 및 프리미티브에 몇 가지 문제가 있음을 발견했습니다. 당신이 * (이 오토 릴리즈 ID 다른 재미 경고로 지정합니다)를 ID *강력한 ID를 전달하는 경우 ARC는 문제를 취할 것입니다.

나 같은 사람이라면 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); 

당신이 이동합니다. 내 두 센트. 참고 :도 작동하므로 분명히 포인터가 없습니다.

관련 문제