runtime-object_getClass 및 objcgetClass

1979 단어
  • object_getClass

  • class 방법은 하나의 클래스 대상이나 실례 대상을 통해 클래스objectgetClass는 하나의 클래스를 획득하는 원류나 루트 원류입니다. 이사를 통해 이사를 획득하는 것 자체가 클래스입니다. 대상마다 슈퍼class 바늘, 부류를 가리키며, 원류 바늘과 구분하기 주의
    Class isa,
    Class  super_class      
    
       Class current = [ViewController class];
        NSLog(@"current = %@--%p",NSStringFromClass(current),current);
    
        Class baseClass = object_getClass(current);
        NSLog(@"baseClass = %@--%p",NSStringFromClass(baseClass),baseClass);
        Class class02 = object_getClass(baseClass);
        NSLog(@"class02 = %@--%p",NSStringFromClass(class02),class02);
        Class class03 = object_getClass(class02);
        NSLog(@"class03 = %@--%p",NSStringFromClass(class03),class03);
    

    인쇄 결과
    TESTRuntime[13422:297689] current = ViewController--0x10a3c1dd8
    TESTRuntime[13422:297689] baseClass = ViewController--0x10a3c1e00
    TESTRuntime[13422:297689] class02 = NSObject--0x10b459ee8
    TESTRuntime[13422:297689] class03 = NSObject--0x10b459ee8
    

    분석 결과:current는 ViewController 클래스의 대상이고baseClass는 ViewController의 클래스 대상을 얻었다. 이름은 같지만 주소는 다르다class02와class03은 모두 루트 클래스 대상의 주소인class03의 주소는 근원류가 자신을 가리키고 폐환을 형성한다는 것을 증명했다.
    objcgetClass의 차이
    objc_getClass는 전송된 문자열에 따라 이 문자열에 대응하는 클래스 대상을 가져옵니다
  • class_replaceMethod
  • //  
    IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );
    

    class_replaceMethod 함수, 이 함수의 행위는 두 가지로 나눌 수 있습니다. 클래스에name이 지정한 방법이 존재하지 않으면class 와 유사합니다.addMethod 함수와 같이 방법이 추가됩니다.클래스에name이 지정한 방법이 이미 존재하면method 와 유사합니다setImplementation과 같이 원래 방법의 실현을 대체합니다.
    주의, 만약에 부류의 방법을 바꾸었지만 자류가 스스로 부류의 방법을 실현했다면 자류의 방법이 부류를 낚지 못했을 때 자류의 방법은 바뀌지 않을 것이다
  • class_getInstanceMethod

  • 클래스의 대상을 가져오는 방법
    4.class_getClassMethod
    하나의 클래스를 얻는 방법은
    사용 시 인코딩에 같은 이름의 대상과 클래스 방법이 동시에 존재할 수 있고 반드시 실현되어야 하며, 성명만 있으면 예를 들어
    - (void)name {
        
    }
    
    + (void)name {
        
    }
    

    좋은 웹페이지 즐겨찾기