2014-04-04 1 views
1

IOS에서 런타임에 클래스에 함수를 동적으로로드하거나 만들 수 있습니까?ios : 응용 프로그램 대리인의 동적로드 기능

나는 런타임에 응용 프로그램 위임 클래스를 추가하는 예를 들어 구체적으로 생각하고 있지만 언어에서도 가능하지는 않습니까?

예를 들어 푸시 알림에 사용되지만 런타임에 푸시 프레임 워크에서 동적으로 추가 할 수 있습니까?

대안으로
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    .... 
} 

, 그것은 단순히 애플 대리자 파일 외부 프레임 워크에서 정의 될 수 있지만, 여전히 애플 대리자 로직의 일부?

답변

1

둘 다 옵션입니다.

동적으로 메소드를 추가하는 것은 class_addMethod이라는 C 함수를 통해 이루어집니다. 기존 방법을 변경할 수도 있습니다 (여전히 원본을 사용합니다!).이 방법을 메서드 스위 즐링이라고합니다. 다른 예를 보려면 Apple documentation 또는 google을 읽을 수 있습니다. 로드하기 위해 라이브러리를 만지려면 프로그램에 뭔가가 있어야합니다 (클래스의 +initialize 메소드에 휙휙 넣은 경우). 그리고 아마도 전체적으로 사용자가 라이브러리를 라이브러리의 어떤 선으로 초기화하도록하는 것이 가장 쉽습니다 [MYLibrary applicationLaunchedWithDelegate:self launchOptions:launchOptions]입니다.

메소드를 추가해야하는 클래스를 알고있는 경우 category을 사용할 수 있습니다.

+0

카테고리를 시작하는 것이 더 쉬워 보입니다. 질문 - 클래스 이름이 바뀔 수있는 경우 카테고리를 어떻게 구현합니까? 예를 들어, iOS App Delegate 클래스는 종종 Project의 이름을 반영하며 AppDelegate 대신 MyFunAppDelegate가 될 수 있습니다. 따라서 모든 프로젝트에서 사용할 수있는 공통 카테고리를 만드는 것은 어려울 것입니다. – Miro

+0

마찬가지로, class_addMethod의 경우 첫 번째 인수는 [AppDelegate class]와 같은 클래스입니다. AppDelegate가 다른 이름으로 호출되면 어떻게됩니까? – Miro

+1

카테고리는 훨씬 간단하지만 그 질문은 문제입니다. "클래스가 앱 위임자가 될 수있는 모든 클래스에 추가 할 수는 없습니다. 클래스 이름을 알아야합니다. 사실 UIApplicationDelegate 프로토콜을 구현하는 클래스가 하나만 있으면됩니다. 라이브러리를 사전 컴파일 (즉, 소스 대신 .a 파일 또는 프레임 워크로 배포) 할 경우 이름을 추측한다고해도 작동하지 않는다고 생각합니다. – Kevin

1

당신은 자신을 응용 프로그램 위임자로 지정할 수 있으며 이전에 호환성을 위해받은 모든 위임을 무시할 수 있습니다. 여기에는 의사 코드가 있습니다. 기본적으로

1) 우리는이 배선이 있습니다

IOS ->

지금 당신이 좋아 중간에 자기를 둘 필요가 appdelegate.m :

ios -> framework -> appdelegate.m

2) 그래서 당신은 같은 다른 변수로 설정 된 위임하여 수행 할 수 있습니다) 당신의 프레임 워크 대리자 (

self.oldDelegate = [UIApplication sharedApplication].대리자;

애플리케이션 대리자로서 자신을 설정

[UIApplication sharedApplication] setDelagate : 자기];

3) 이전 버전과의 호환성을 위해 당신은 oldDeleagete 모든 대표를 우회 할 필요가

4) 경고 :이 의사 코드는 당신에게 아이디어를 제공하지만 앱의 멀티 스레딩을 돌볼 필요가 기억하는 것입니다 거기에 당신과 같은 다른 프레임 워크가있을 수 있습니다 둘 다 애플 리케이션 대표를 변경하고 있지만 잘못된 것입니다 oldDelegate 및 배선이 작동하지 않습니다. 이런 것들에 대해 더 많은 관심을 기울입니다. look at this

+0

이것은 오래된 질문이지만 비슷한 접근 방식을 취한 것으로 생각됩니다. CustomAppDelegate는 몇 가지 사용자 정의 메소드로 구성되며, 메시지 수신시 메소드를 처리하는 경우 자체 테스트합니다. 그렇지 않은 경우 유지하는 기본 AppDelegate에서 메시지/메소드를 호출합니다. 그래서 그것은 프록시 또는 짜릿한 접근 방식입니다. – Miro

관련 문제