나를 위해 Objective-C의 주변 환경에 반응하고 설명하고 혼란스럽게 처리 할 수 있습니다. 이것은 기초 단계에서 언제든지 _cmd
을 참조 할 수있는 확고한 능력으로 시작하여 현재 SEL
을 얻습니다. 거기에서, 당신이에 참여하기 위해 무엇을 선택 NSInvocation
주술 또는 런타임 발뺌 당신에게 달려 있습니다.메서드 내에서 현재 블록 컨텍스트 인 à la _cmd를 검사합니다.
이제 블록 내부에, 당신은 여전히 _cmd
를 호출하고 현재의 "컨텍스트"의 막연한 설명을 얻을 수있는, 즉
__30-[RoomController awakeFromNib]_block_invoke123RoomController
설명? 예. 정보? 오케이.하지만 그렇게 유용하지는 않습니다. 어떻게 블록, 특히 호출 서명, args, 등 내부에 역동적이고 정확한 런타임 정보를 어떻게합니까?
I have found a useful little method to "describe" a block 미리 블록 유형을 얻으려고하는 정보 유형의 좋은 예가됩니다.
typedef void(^blockHead)(NSString*);
blockHead v = ^(NSString*sandy) { NSLog(@"damnDog",nil); };
Log([v blockDescription]);
[v blockDescription] = <NSMethodSignature: 0x7fd6fabc44d0>
number of arguments = 2
frame size = 224
is special struct return? NO
return value: -------- -------- -------- --------
type encoding (v) 'v'
flags {}
modifiers {}
frame {offset = 0, offset adjust = 0, size = 0, size adjust = 0}
memory {offset = 0, size = 0}
argument 0: -------- -------- -------- --------
type encoding (@) '@?'
flags {isObject, isBlock}
modifiers {}
frame {offset = 0, offset adjust = 0, size = 8, size adjust = 0}
memory {offset = 0, size = 8}
argument 1: -------- -------- -------- --------
type encoding (@) '@"NSString"'
flags {isObject}
modifiers {}
frame {offset = 8, offset adjust = 0, size = 8, size adjust = 0}
memory {offset = 0, size = 8}
class 'NSString'
당신이 그것을 어떻게 든 참조 할 수 없다면 당신은 블럭 안의 블럭 자체에 대해서 정말로 알 수 없습니다. 왜 이런 정보를 알고 싶습니까? –
블록 API가 확산되면서 블록 호출자에게 말할 때가 종종 어렵습니다. 컴파일러는 일치하지 않는 서명을 허용합니다 ...부정확 한 수의 인수와 이름이 같지만 블록 유형이 다른 여러 메소드가 불만없이 공존 할 수 있습니다. 실제로 가끔은 무엇이 일어나고 있는지를 아는 것이 좋을 것입니다. "나는 생각한다"고 생각한다. –
블록을 호출하기 전에 블록의 유형을 검사 할 수 있지만 잘못된 매개 변수로 이미 호출 되었기 때문에 블록 내부에서 많은 작업을 수행 할 수 없습니다. –