OC 반사 메커니즘
실행 상태 에서 임의의 클래스 에 대해 이 클래스 의 모든 속성 과 방법 을 알 수 있 습 니 다.임의의 대상 에 대해 서 는 그것 의 임의의 방법 을 호출 할 수 있다.이런 동적 획득 과 동적 호출 대상 의 방법의 기능 은 바로 반사 메커니즘 이다.
oc 도 반사 메커니즘 을 제 공 했 는데 이런 동적 프로 그래 밍 메커니즘 은 oc 언어 를 더욱 유연 하 게 할 수 있다.oc 는 세 가지 프로 그래 밍 방식 과 운영 환경 간 의 상호작용 을 제공 합 니 다.
첫 번 째: oc 의 소스 코드 를 직접 통과 합 니 다.이것 은 가장 흔히 볼 수 있 는 방식 으로 운영 환경 이 백 스테이지 에서 일 하 는 것 을 책임 진다.코드 를 컴 파일 할 때 컴 파일 러 는 대량의 데이터 구 조 를 만 들 고 동적 체 제 를 실현 하 는 함 수 를 만 듭 니 다. 그 중에서 데이터 구 조 는 클래스, 유형 에서 정 의 된 데 이 터 를 저장 하고 함 수 는 처리 방법 호출 을 책임 집 니 다.
두 번 째: nsobject 류 에서 정 의 된 방법 으로 동적 프로 그래 밍 을 합 니 다.우 리 는 대부분의 클래스 가 nsobject 의 하위 클래스 (nsproxy 예외) 라 고 정 의 했 기 때문에 모든 대상 은 nsobject 의 방법 으로 컴 파일 할 수 있 습 니 다.소수의 경우 nsobject 는 방법 모델 만 제공 하고 방법 에 코드 를 제공 하지 않 았 다.
세 번 째: 실행 시 함 수 를 직접 호출 하여 동적 프로 그래 밍 을 합 니 다.실행 할 때 시스템 은 동적 공유 라 이브 러 리 입 니 다. 이것 은 모두 c 입 니 다. oc 프로 그래 밍 에 필요 한 것 이 아니 지만 일부 함수 들 은 oc 프로 그래 밍 에서 도 유용 합 니 다.
클래스 획득
1. Class NSClassFromString (NSString * aClassName) 함 수 를 사용 하여 가 져 옵 니 다. 문자열 인 자 를 입력 해 야 합 니 다. 이 문자열 의 값 은 클래스 의 클래스 이름 입 니 다.
2. 특정한 클래스 의 class 방법 을 호출 하여 가 져 옵 니 다.[Person class] 는 Person 클래스 에 대응 하 는 Class 를 되 돌려 줍 니 다.
3. 특정한 대상 의 class 방법 을 호출 합 니 다. 이 방법 은 NSObject 클래스 의 한 방법 입 니 다.그래서 OC 대상 이 다 이 방법 을 사용 할 수 있 습 니 다.
두 번 째 방법의 장점:
1. 코드 가 더욱 안전 합 니 다. 프로그램 은 컴 파일 단계 에서 방문 해 야 할 Class 대상 이 존재 하 는 지 확인 할 수 있 습 니 다.
2. 프로그램의 성능 이 높 습 니 다. 이 방식 은 호출 방법 이 필요 없 기 때 문 입 니 다.
Class clazz = NSClassFromString(@"NSDate");
NSLog(@"%@",class); // NSDate
id date =[ [clazz alloc]init]; NSLog(@"%@",[date class]); //_NSDate = = = > > oc 의 많은 디자인 은 클래스 클 러 스 터 를 사용 합 니 다. NSDate 는 이 클래스 의 전단 일 뿐 프로그램 에서 [[NSDate alloc] init] 를 호출 합 니 다.대상 을 만 들 때 프로그램 은 NSDate 의 하위 클래스 인 스 턴 스 를 되 돌려 줍 니 다. NSDate 의 인 스 턴 스 가 아 닙 니 다.
NSLog(@"%d",class == NSDate.class); // 1
상속 관계 검사
프로그램 이 하나의 클래스 의 상속 관계 만 확인 해 야 한다 면 NSObject 가 제공 하 는 방식 으로 직접 판단 할 수 있다.
1. isKindOfClass: 클래스 매개 변 수 를 입력 하여 이 대상 이 이 클래스 와 하위 클래스 의 인 스 턴 스 인지 판단 해 야 합 니 다.
2. isMemberOfClass: 클래스 매개 변 수 를 입력 하여 이 대상 이 이러한 인 스 턴 스 인지 판단 해 야 합 니 다.
3. conforms ToProtocol: 하나의 Protocol 매개 변 수 를 입력 하여 이 대상 이 이 클래스 와 하위 클래스 의 인 스 턴 스 인지 판단 해 야 합 니 다. (이 방법 은 하나의 Protocol 매개 변 수 를 입력 해 야 합 니 다. 프로그램 에서 두 가지 방법 으로 얻 을 수 있 습 니 다. ① oc 가 제공 하 는 @ protocol 명령 으로 이 루어 집 니 다. ② Protocol * NSProtocol FromString (NSString * namestr) 을 호출 합 니 다.; 방법 은 프로 토 콜 이름 문자열 에 따라 해당 하 는 프로 토 콜 을 가 져 옵 니 다)
동적 호출 방법
#import
//
@interface Perosn : NSObject
@end
#import "Perosn.h"
#import
#import
//
@implementation Perosn
- (void)move:(NSNumber *)count
{
int num = [count intValue];
for (int i = 0; i < num; i ++) {
NSLog(@"%@",[NSString stringWithFormat:@" ~~%d", i]);
}
}
- (double)addSpeed:(double)factor
{
// move
// performSelector: move:
[self performSelector:@selector(move:) withObject:[NSNumber numberWithInt:2]];
[self performSelector:NSSelectorFromString(@"move:") withObject:[NSNumber numberWithInt:2]];
// objc_msgSend() move:
objc_msgSend(self, @selector(move:),[NSNumber numberWithInt:3]);
objc_msgSend(self, NSSelectorFromString(@"move:"),[NSNumber numberWithInt:3]);
return 100 *factor;
}
@end
obj c 사용msgSend 오류 보고 가능 / / objcmsgSend () 가 잘못 되 었 습 니 다. function call 에 너무 많은 인자 가 있 습 니 다. expected 0, have 3 해결 방법 / / Build Setting -- > Apple LLVM - Preprocessing -- > Enable Strict Checking of obbcmsgSend Calls 를 NO 로 변경
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.