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...
답변
Laurent의 답변을 확대하십시오.
블록은 구현과 데이터의 조합입니다. 두 개의 블록이 동일 할 경우 정확히 동일한 구현을 모두 가져야하고 정확히 동일한 데이터를 캡처해야합니다. 따라서 비교에서는 구현과 데이터를 비교해야합니다.
구현을 쉽게 비교할 수 있다고 생각할 수도 있습니다. 실제로 컴파일러의 옵티마이 저가 작동하는 방식 때문이 아닙니다.
간단한 데이터를 비교하는 것은 상당히 간단하지만 블록은 C++ 객체 (실제로 언젠가는 작동 할 수 있음)를 포함하여 객체를 캡처 할 수 있으며 비교할 때 고려해야 할 수도 있고 그렇지 않을 수도 있습니다. 단순한 구현은 캡처 된 내용의 바이트 수준 비교 만 수행합니다. 그러나, 오브젝트 레벨 비교자를 사용하여 오브젝트의 평등성을 테스트하고자 할 수도 있습니다.
그런 다음 __block 변수 문제가 있습니다. 블록 자체는 캡처 된 변수를 필요로하지 않으므로 캡쳐 된 변수를 __block과 관련된 메타 데이터가 실제로 포함되지 않습니다. 따라서 비교는 컴파일러 코드gen을 크게 변경하지 않고 __block 값을 비교할 수 없습니다.
이 모든 것은 아니요, 현재 블록을 비교하고 이유 중 일부를 설명 할 수 없다는 것입니다. 이 방법이 유용하다고 생각되면 http://bugreport.apple.com/을 통해 버그를 신고하고 사용 사례를 제공하십시오.
나는 이것이 가능하지 않다고 생각합니다. 블록은 대략 전역 함수 나 로컬 변수에 액세스 할 수있는 고급 함수로 볼 수 있습니다. 함수의 내용을 비교할 수없는 것과 같은 방법으로 블록의 내용을 비교할 수도 없습니다.
당신이 할 수있는 일은 그들의 low-level implementation을 비교하는 것뿐입니다.하지만 컴파일러가 동일한 콘텐트를 가진 두 개의 블록이 그들의 구현을 공유하도록 보장 할 것입니다.
불가능합니다. – bbum
컴파일러 구현 및 언어 디자인과 관련하여 궁금한 점은 입니다 (프로그래밍이 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는 존재할 수 없습니다.
- 1. Jquery는 두 개의 선택기를 비교할 수 있습니까?
- 2. Apache POI를 사용하여 두 개의 MS Word 문서를 비교할 수 있습니까? 다른 Api를 사용할 수 있습니까?
- 3. UIPickerView에서 어떻게 비교할 수 있습니까?
- 4. Google Analytics는 왜 두 개의 스크립트 블록을 가지고 있습니까?
- 5. 간단한 방법으로 2 개의 mySQL 테이블을 서로 비교할 수 있습니까?
- 6. 어떻게 비교할 수 있습니다 .Net2.0에서 두 Excel 시트를 비교할 수 있습니까?
- 7. 데이터웨어 하우스의 2 개의 큐브를 서로 직접 비교할 수 있습니까?
- 8. ObjectiveC 함수를 boost :: bind() 할 수 있습니까?
- 9. ObjectiveC @selector를 NSDictionary에 넣을 수 있습니까?
- 10. ClearCase에서 스트림을 서로 비교할 수 있습니까?
- 11. BLAST를 사용하여 2 개의 비 생물학적 문자열을 비교할 수 있습니까?
- 12. 어떻게 PHP를 사용하여 다운로드없이 2 개의 파일을 비교할 수 있습니까?
- 13. 어떻게 문자열과 bool 배열을 비교할 수 있습니까?
- 14. regexp에 char를 비교할 수 있습니까?
- 15. 두 문자열을 DateTimes로 변환하고 VB.NET에서 비교할 수 있습니까?
- 16. vba를 사용하여 두 가지 Excel 파일을 비교할 수 있습니까?
- 17. MSXML을 사용하여 두 xml 파일을 비교할 수 있습니까?
- 18. ActionScript에서 두 개의 날짜 값 비교 - 하루 종일 값을 비교할 수 있습니까?
- 19. 라인 순서를 고려하지 않고 두 개의 서로 다른 텍스트 파일을 어떻게 비교할 수 있습니까?
- 20. 두 개의 숫자가 MFC (VC++)의 범위에있는 경우 어떻게 비교할 수 있습니까?
- 21. 동시에 두 개의 개별 dicts에 코드 블록을 실행하십시오.
- 22. 다른 압축 형식을 어떻게 비교할 수 있습니까?
- 23. PHP와 Perl의 성능을 어떻게 비교할 수 있습니까?
- 24. 두 개의 JSliders를 클릭 할 수 있습니까?
- 25. UIView에 두 개의 UITableview를 넣을 수 있습니까?
- 26. 동시에 두 개의 값을 던질 수 있습니까?
- 27. openCV를 사용하여 서로 다른 두 이미지의 두 얼굴을 비교할 수 있습니까?
- 28. 어떻게하면 cpp에서 대기열을 비교할 수 있습니까?
- 29. NumberFormatter - ObjectiveC
- 30. 람다를 비교할 수 없습니다
가져온 상수 및 __block 객체를 고려하는 것을 완전히 잊었습니다.종속성이 너무 많습니다. 고마워요! 이제는 나에게 분명하다. 블록 비교에 대한 아이디어를 얻었는데, 왜냐하면 사용자 코드가 내 개체 메서드 중 하나의 다른 호출에 유사한 완성 처리기를 설정했는지 확인하기를 원했기 때문입니다. 대안을 생각해야합니다. –