program tip

"Objective-C 블록 없음"을 표시하는 데 적합한 nil 또는 NULL은 무엇입니까?

radiobox 2020. 11. 25. 07:50
반응형

"Objective-C 블록 없음"을 표시하는 데 적합한 nil 또는 NULL은 무엇입니까?


내가 목표 - C 블록에 대해 아무것도 통과하지하려면, 어떤 키워드 나는 사용한다 NULLnil? 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 객체로 생각하고 싶습니다.

참고 URL : https://stackoverflow.com/questions/5766208/which-is-the-right-one-nil-or-null-to-mark-no-objective-c-block

반응형