"Objective-C 블록 없음"을 표시하는 데 적합한 nil 또는 NULL은 무엇입니까?
내가 목표 - C 블록에 대해 아무것도 통과하지하려면, 어떤 키워드 나는 사용한다 NULL
나 nil
? Objective-C 블록은 내가 아는 것처럼 Objective-C 객체이지만 함수 포인터로 표현되기 때문에 이것을 묻습니다.
NULL
그리고 nil
둘 다 표시 0x0
그러나 그들이 의미 다른, 포인터를. 그래서 저는 이것에 대해 걱정합니다.
블록은 함수 포인터로 표시되지 않습니다. 그것들은 블록으로 표현되고 이것은 ^
그들의 선언 에서 기호 로 표시됩니다 . 후드 아래에서 유일한 유사점은 호출 구문입니다. 그렇지 않으면 둘 다 아주 아주 다릅니다.
종종 메서드를 호출하는 것이 유용합니다. 예를 들어 가비지 컬렉션을 사용하지 않는 경우 나중에 보관하려면 블록 에서 메서드 를 호출 해야 합니다 copy
. 자동 보유 카운트의 출현으로 ARC 포인터 캐스트 규칙이 Block_copy
매크로 사용을 방지하기 때문에 이것이 블록을 복사하는 유일한 방법이기도합니다 .
NULL
컴파일러에 따라 0
또는 (void*)0
. 이것은 모든 종류의 포인터에서 작동합니다. 그러나 Objective-C의 언어 규칙으로 인해 직접 캐스트 할 수없는 유형에 메시지를 보내려고하면 경고가 표시됩니다 id
(ARC를 사용하는 경우 오류).
블록에 메시지를 보내는 것이 유용 할 수 있으므로이를 사용해야 nil
합니다.
[편집] nil
또는 둘 중 하나를 사용하면 NULL
정확히 동일한 이진 코드가 생성됨을 분명히합시다 . 상수 선택은 블록을 Objective-C 객체로 간주하는지 여부에 따라 결정되어야합니다. 이것은 당신이 직접 작성 retain
하고 release
전화 해야했던 시절에는 더 큰 거래 였지만 이제는 ARC가 모든 메모리 관리 작업을 수행합니다.
ARC가 문제가되기 전에 블록을 사용했다면 아마도 Objective-C 객체라고 생각할 것입니다. 그렇지 않다면 아마 그들이 있다고 생각하거나 깨닫지 못할 것입니다. 언어에는 여전히 몇 가지 정체성의 유물이 있지만 (예를 들어 __weak
또는 __unsafe_unretained
블록에 대한 포인터를 가질 수 있음 ) 대부분의 경우 그 차이는 무시할 수 있습니다. 하나를 골라서 고수하십시오. 내 블록을 Objective-C 객체로 생각하고 싶습니다.
'program tip' 카테고리의 다른 글
컬렉션의 Groovy 맵 방법 (0) | 2020.11.25 |
---|---|
자바 스크립트에서 window.location.href를 조롱 (0) | 2020.11.25 |
인터페이스, 다중 상속 vs 인터페이스, 인터페이스의 이점을 사용하는 이유는 무엇입니까? (0) | 2020.11.25 |
예외 Junit 4.10 후 Mockito 확인 (0) | 2020.11.25 |
knockoutjs-로드시 트리거되는 매개 변수가있는 바인딩 (0) | 2020.11.24 |