UIViewController_Swizzled의 원리와 사용
2695 단어 IOS 기본 개발
<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에서 이루어진 코드)를 실행한다.
함수 교체
사용 절차: 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