2010-01-30 2 views
17
float pi = 3.14; 
float (^piSquare)(void) = ^(void){ return pi * pi; }; 
float (^piSquare2)(void) = ^(void){ return pi * pi; }; 

[piSquare isEqualTo: piSquare2]; // -> want it to behave like -isEqualToString... 

답변

26

Laurent의 답변을 확대하십시오.

블록은 구현과 데이터의 조합입니다. 두 개의 블록이 동일 할 경우 정확히 동일한 구현을 모두 가져야하고 정확히 동일한 데이터를 캡처해야합니다. 따라서 비교에서는 구현과 데이터를 비교해야합니다.

구현을 쉽게 비교할 수 있다고 생각할 수도 있습니다. 실제로 컴파일러의 옵티마이 저가 작동하는 방식 때문이 아닙니다.

간단한 데이터를 비교하는 것은 상당히 간단하지만 블록은 C++ 객체 (실제로 언젠가는 작동 할 수 있음)를 포함하여 객체를 캡처 할 수 있으며 비교할 때 고려해야 할 수도 있고 그렇지 않을 수도 있습니다. 단순한 구현은 캡처 된 내용의 바이트 수준 비교 만 수행합니다. 그러나, 오브젝트 레벨 비교자를 사용하여 오브젝트의 평등성을 테스트하고자 할 수도 있습니다.

그런 다음 __block 변수 문제가 있습니다. 블록 자체는 캡처 된 변수를 필요로하지 않으므로 캡쳐 된 변수를 __block과 관련된 메타 데이터가 실제로 포함되지 않습니다. 따라서 비교는 컴파일러 코드gen을 크게 변경하지 않고 __block 값을 비교할 수 없습니다.

이 모든 것은 아니요, 현재 블록을 비교하고 이유 중 일부를 설명 할 수 없다는 것입니다. 이 방법이 유용하다고 생각되면 http://bugreport.apple.com/을 통해 버그를 신고하고 사용 사례를 제공하십시오.

+0

가져온 상수 및 __block 객체를 고려하는 것을 완전히 잊었습니다.종속성이 너무 많습니다. 고마워요! 이제는 나에게 분명하다. 블록 비교에 대한 아이디어를 얻었는데, 왜냐하면 사용자 코드가 내 개체 메서드 중 하나의 다른 호출에 유사한 완성 처리기를 설정했는지 확인하기를 원했기 때문입니다. 대안을 생각해야합니다. –

4

나는 이것이 가능하지 않다고 생각합니다. 블록은 대략 전역 함수 나 로컬 변수에 액세스 할 수있는 고급 함수로 볼 수 있습니다. 함수의 내용을 비교할 수없는 것과 같은 방법으로 블록의 내용을 비교할 수도 없습니다.

당신이 할 수있는 일은 그들의 low-level implementation을 비교하는 것뿐입니다.하지만 컴파일러가 동일한 콘텐트를 가진 두 개의 블록이 그들의 구현을 공유하도록 보장 할 것입니다.

+1

불가능합니다. – bbum

12

컴파일러 구현 및 언어 디자인과 관련하여 궁금한 점은 입니다 (프로그래밍이 100 % 동일하지 않은 경우에만). 두 프로그램이 같은 기능을 수행하는지 결정하는 것은 정지 문제를 해결하는 것과 같습니다. 이것은 라이스의 정리의 고전적인 결과입니다. 튜링 기계의 "흥미로운"특성은 결정 불가능합니다. "흥미로운"은 일부 기계에서는 사실이고 다른 기계에서는 거짓이라는 것을 의미합니다.

그냥 재미를 위해서 여기에 증거가 있습니다. 두 블록이 동등한지를 결정하는 함수를 생성하여 EQ (b1, b2)라고합니다. 이제 우리는 그 함수를 사용하여 정지 문제를 해결할 것입니다. 우리는 내가 너무 좋아하는 튜링 기계 M이 입력을 중단한다면 우리에게 알려줍니다 (M, I) 새로운 기능 HALT를 만들 :

BOOL HALT(M,I) { 
    return EQ(
    ^(int) {return 0;}, 
    ^(int) {M(I); return 0;} 
); 
} 

M (I)가 블록, HALT 그래서 (M 동일 다음이 멈추는 경우, I)는 YES를 리턴합니다. M (I)이 정지하지 않으면 블록은 이 아니며이 아니므로 HALT (M, I)는 NO를 반환합니다. 블록을 블록으로 실행할 필요는 없습니다. 가상의 EQ 기능은 블록을보고 그 동등성을 계산할 수 있습니다.

이제 우리는 불가능한 중단 문제를 해결했습니다. 따라서 EQ는 존재할 수 없습니다.

관련 문제