UIViewController_Swizzled의 원리와 사용

2695 단어 IOS 기본 개발
실현된 기능: 복잡한 프로그램의 아주 간단한 라이브러리 원본을 추적할 수 있으며, 각view Controller의 층층이 끼워 넣은 순서를 보고, UIView Controller를 표시할 때 로그를 기록할 수 있습니다.원리: UIView Controller의viewDid Appear를 바꾸는 방법: 방법Objecitve-C의 중요한 특성은 런타임(운행시)이다. 인터랙티브 with the 런타임(상호작용 운행)에서 운행시 함수 부분은 애플이/usr/lib/libobjc.를 제시했다.A.dylib 라이브러리, 이 공유 라이브러리는 동적 속성을 지원하는objective-c 언어를 제공합니다. 인터페이스를 통해 다른 언어를 Objective-C의 중간 층 (브리지 층) 에서 실행할 수 있으며, 라이브러리의 함수는 순수 C 언어로 정의됩니다.여기서 #import
 <objc/runtime.h>

런타임 확인 함수는 다음 코드에서 동적 호출에 사용됩니다.
+(void)load
{
    isSwizzed = NO;
}

일반적인 경우, 클래스 안의 방법은 메인 클래스 안의 같은 명칭을 다시 쓸 수 있다.만약 두 종류가 같은 명칭을 실현한 방법이 있다면, 단지 한 방법만 호출될 것이다.그러나 +load: 하나의 클래스가 메모리에 읽힐 때,runtime는 이 클래스와 그 클래스마다 +load: 메시지를 보냅니다.
-(void)swizzviewDidAppear:(BOOL)animated
{
    [self printPath];
    // Call the original method (viewWillAppear)
    [self swizzviewDidAppear:animated];
}

코드가 좀 이상해 보일 수도 있어. 돌아가는 것 같지 않아?물론 귀속은 아니다. 왜냐하면runtime에서 함수 실현은 이미 교환되었기 때문이다.viewDid Appear 호출: 당신이 실행한 swizzledviewDidAppear:, swizzledviewDidAppear:에서 swizzled 호출view Did Appear: 실제로 호출된 것은 원래의view Did Appear: 그래서 효과는view Did Appear의 호출은 swizzview Did Appear를 먼저 실행하고 swizzview Did Appear의 swizzview Did Appear(원래 view Did Appear에서 이루어진 코드)를 실행한다.
함수 교체
  • class_getInstanceMethod
  • class_addMethod
  • class_replaceMethod

  • 사용 절차: 1. github에서 UIViewController-Swizzled를 다운로드하면 cocopad를 다운로드할 수도 있고 직접dd로 프로젝트에 들어갈 수도 있다.2、바로 있어요.pch 파일 #import 은 모든 controller가 이 헤더 파일을 포함합니다.3、AppDelegate.m의 didFinishLaunchingWithOptions 메서드에서 매크로 SWIZ 호출IT_WITH_TAG(LOGTAG) 또는 SWIZZIT.   
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        SWIZZ_IT_WITH_TAG(LOGTAG);
        return YES;
    }

    소스 주소:https://github.com/RuiAAPeres/UIViewController-Swizzled
    Objective-C의 실행 중 가장 논란이 되는 흑마법: method swizzling:http://www.cocoachina.com/ios/20160121/15076.html

    좋은 웹페이지 즐겨찾기