runtime 기초 편 (2)
방법 유형
Method 유형 은 하나의
objc_method
구조 체 지침 이 고 구조 체 objc_method
는 세 명의 구성원 이 있다./// An opaque type that represents a method in a class definition.
typedef struct objc_method *Method;
struct objc_method {
SEL method_name; //
char *method_typesE; //
IMP method_imp; //
}
방법 모든 방법
// ,
method_invoke
// ,
method_invoke_stret
//
method_getName
// IMP
method_getImplementation
// type encoding
method_getTypeEncoding
//
method_copyReturnType
//
method_copyArgumentType
//
method_getReturnType
//
method_getNumberOfArguments
//
method_getArgumentType
//
method_getDescription
// IMP
method_setImplementation
// IMP
method_exchangeImplementations
함수 목록 가 져 오기
- (int)testInstanceMethod:(NSString *)name andValue:(NSNumber *)value {
NSLog(@"%@", name);
return value.intValue;
}
- (NSArray *)arrayWithNames:(NSArray *)names {
NSLog(@"%@", names);
return names;
}
- (void)getMethods {
unsigned int outCount = 0;
Method *methodList = class_copyMethodList(self.class, &outCount);
for (unsigned int i = 0; i < outCount; ++i) {
Method method = methodList[i];
SEL methodName = method_getName(method);
NSLog(@" :%@", NSStringFromSelector(methodName));
//
unsigned int argumentsCount = method_getNumberOfArguments(method);
char argName[512] = {};
for (unsigned int j = 0; j < argumentsCount; ++j) {
method_getArgumentType(method, j, argName, 512);
NSLog(@" %u :%s", j, argName);
memset(argName, '\0', strlen(argName));
}
char returnType[512] = {};
method_getReturnType(method, returnType, 512);
NSLog(@" :%s", returnType);
// type encoding
NSLog(@"TypeEncoding: %s", method_getTypeEncoding(method));
}
free(methodList);
}
우 리 는 테스트 방법 을 써 서 호출 합 시다.
+ (void)test {
HYBMethodLearn *m = [[HYBMethodLearn alloc] init];
[m getMethods];
//
int returnValue = ((int (*)(id, SEL, NSString *, NSNumber *))objc_msgSend)((id)m, @selector(testInstanceMethod:andValue:), @" ", @100);
NSLog(@"return value is %d", returnValue);
}
그 인쇄 결 과 는 다음 과 같다.
:getMethods
0 :@
1 ::
:v
TypeEncoding: v16@0:8
:testInstanceMethod:andValue:
0 :@
1 ::
2 :@
3 :@
:i
TypeEncoding: i32@0:8@16@24
:arrayWithNames:
0 :@
1 ::
2 :@
:@
TypeEncoding: @24@0:8@16
return value is 100
왜 두 개의 인자 가 더 생 겼 습 니까?
methodgetNumberOfArguments 는 함수 의 모든 매개 변수 유형 을 가 져 옵 니 다. 위 에서 우리 가 정의 한 함수 에서 예 를 들 어 getMethods 는 매개 변수 가 없 는데 왜 두 개의 매개 변 수 를 인쇄 합 니까?그리고 - (int) test InstanceMethod: (NSString *) name and Value: (NSNumber *) value 는 두 개의 인자 밖 에 없 는데 왜 네 개의 인자 가 있 습 니까?다음은 우리 가 자세하게 말 하 겠 다.
((void (*)(id, SEL))objc_msgSend)((id)m, @selector(getMethods));
//
int returnValue = ((int (*)(id, SEL, NSString *, NSNumber *))
objc_msgSend)((id)m,
@selector(testInstanceMethod:andValue:),
@" ",
@100);
함수 인 코딩
methodgetTypeEncoding 은 함수 의 인 코딩 을 가 져 옵 니 다. 그 결 과 는 일련의 값 입 니 다.
그 러 고 보 니 뭘 알 수 있 을까요?이 몇 가지 값 을 보면 알 수 있다.
method_invoke
objc_msgSend
함 수 를 사용 하 는 것 외 에 method_invoke
도 사용 할 수 있 습 니 다. 예 를 들 어://
Method method = class_getInstanceMethod([self class], @selector(testInstanceMethod:andValue:));
//
returnValue = ((int (*)(id, Method, NSString *, NSNumber *))method_invoke)((id)m, method, @" method_invoke", @11);
NSLog(@"call return vlaue is %d", returnValue);
//
int returnValue = ((int (*)(id, SEL, NSString *, NSNumber *))
objc_msgSend)((id)m,
@selector(testInstanceMethod:andValue:),
@" ",
@100);
NSLog(@"return value is %d", returnValue);
Type Encoding
부호화 값
속뜻
c
대표 char 형식
i
대표 int 형식
s
대표 short 형식
l (소문 자 L)
log 형식 을 대표 하 며 64 비트 프로세서 에서 도 32 비트 로 처리 합 니 다.
q
대표 long long 유형
C
서명 되 지 않 은 char 형식 을 대표 합 니 다.
I (대문자 i)
서명 되 지 않 은 int 형식 을 대표 합 니 다.
S
서명 되 지 않 은 짧 은 형식 을 대표 합 니 다.
L
서명 되 지 않 은 long 형식 을 대표 합 니 다.
Q
서명 되 지 않 은 long 형식 을 대표 합 니 다.
f
대표 float 유형
d
대표 double 형식
B
C + + 의 bool 또는 C99 를 대표 하 는Bool
v
void 형식
*
대표 char * 형식
@
대표 대상 유형
#
대표 클래스 대상 (Class)
:
대표 방법 selector (SEL)
[array type]
대표 array
{name=type…}
대표 구조 체
(name=type…)
대표 조합
bnum
A bit field of num bits
^type
A pointer to type
?
An unknown type (among other things, this code is used for function pointers)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.