나는 objective-c 라이브러리 프로젝트 ('MyLib')를 연구 중이다. 이 라이브러리가 'TestApp'에 포함되어 있다고 가정 해 보겠습니다. 이제 'TestApp'에는 'Xlib'라는 또 다른 라이브러리가 포함되어 있습니다. 이 Xlib에는 m1 메소드가있는 C1 클래스가 있습니다.객관적인 c에서 카테고리를 동적으로 만드는 방법은 무엇입니까?
//C1.h is part of Xlib
@interface C1
- (void) m1;
@end
이제 때마다 (M1)가 호출 은 MYLIB 코드의 조각을 실행해야합니다. 내가 MYLIB의 범주를 만들 경우 내 접근했다 :
@interface C1 (mycat)
@end
@implementation C1 (mycat)
+ (void) load{
//code to swizzle method in class C1 from: @selector(m1) to: @selector(mycat_m1)
}
- (void) mycat_m1{
/*
insert code that I want to execute
*/
[self mycat_m1]; //calling the original m1 implementation
}
@end
문제 : MYLIB는 클래스 C1이 없습니다. 따라서 존재하지 않는 클래스에서 카테고리를 만들려고 할 때 MyLib을 빌드 할 수 없습니다. 따라서 컴파일 오류가 발생합니다.
그래서, 나는 내부에 위의 코드를 포장하려 :#if defined(__has_include)
#if __has_include("C1.h")
/* above category code */
#endif
#endif
MYLIB 컴파일 지금은 잘 구축,하지만 C1.h이 MYLIB에 존재하지 때문에, mylib.framework이가없는 것 범주.
이제 두 가지 옵션이 있습니다 : 1.이 카테고리를 동적으로 생성하면 라이브러리가 앱에 포함되고 앱이 실행될 때 TestApp에 Xlib이 포함되는지 여부에 따라이 카테고리가 생성됩니다 . 2.이 범주 코드가있는 파일을 컴파일 소스에서 제거한 다음 프레임 워크에서 해당 파일을 TestApp로 노출하십시오.
두 가지 옵션 중 하나를 해결할 수 없습니다. 기존 옵션에 대한 아이디어가 있습니까? 또는 새로운 옵션이 있습니까?
편집 : 질문 이후 추가 세부 사항은
'swizzle'? 그리고 너가 원하는게 뭐야? 목적은 무엇입니까? – Simon
앱에있을 수있는 클래스 c1에 메소드 m1이 있습니다. m1이 앱에서 호출 될 때마다 제 라이브러리는 코드를 실행해야합니다. 따라서, swizzling. downvote에 대해 설명해 주시겠습니까? 질문이 정확하게 틀이 맞지 않거나 여기에 명백한 것이 빠져 있습니까? – user2473992
나는 그것을 투표하지 않았으므로, 저를 비난하지 마라. 질문을 제대로하는 방법에 대한 게시물을 확인하십시오. 여기에있는 내용을 이해하는 것이 정말 어렵습니다. – Simon