2012-01-31 3 views
10

나는 내 애플 리케이션에서 자주 사용하는 유용한 클래스/메소드를 포함하는 자체 프레임 워크를 개발했습니다. 최근에 NSString "NSString + Extensions.h/m"에 대한 클래스 확장을 추가하여 내 자신의 메서드를 추가했습니다. 예 :클래스 확장 및 프레임 워크

  • 는 NSString + Extensions.h
@interface NSString (Extensions) 
- (NSString *)removeDiacritics; 
@end 
  • 는 NSString + Extensions.m
#import "NSString+Extensions.h" 

@implementation NSString (Extensions) 

- (NSString *)removeDiacritics 
{ 
    return [[[NSString alloc] initWithData:[self dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease]; 
} 

@end 
,

프레임 워크를 성공적으로 컴파일합니다. 그러나 나는 모든 응용 프로그램이 클래스 확장의 기능 중 하나를 사용하려고하면

내가 얻을 ...

  • AppDelegate.m
// CUtils is the name of the framework. CUtils.h contains #import of all header files 
// contained in my framework 
#import <CUtils/CUtils.h> 


    @implementation AppDelegate 

    ... 

    - (void)applicationDidBecomeActive:(UIApplication *)application 
    { 
     /* 
     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previouslyin the background, optionally refresh the user interface. 
     */ 

     NSString *toto = @"Je suis une chaîne avec des caractères spéciaux"; 
     NSLog(@"%@", toto); 
     NSLog(@"%@", [toto removeDiacritics]); 
    } 

다음 오류 :

2012-01-31 17 : 01 : 09.921 TestCUtils [4782 : 207] Je SUIS UNE 셰네 AVEC DES caractères SPECIAUX 2012-01-31 17 : 01 : 09.924 TestCUtils [4782 : 207] - [__ NSCFConstantString removeDiacritics] : 인식 할 수없는 선택기

하지만 내 클래스 확장을 추가하는 경우 직접 인스턴스 0x340c로 전송 응용 프로그램 (내 프레임 워크 외부)에서, 그것은 잘 작동 ...

어떤 힌트?

** 수정 **

당신의 일부가 물었다, 나는이 -all_load 및 '기타 링커 플래그'에 -ObjC 옵션을 추가했지만 문제가 남아있다.

enter image description here

답변

9

#import "NSString+Extensions.h" 필요 것처럼 소리 -all_load

+0

굉장! 그것은 작동합니다. 내 응용 프로그램 대상에 -ObjC 링커 플래그 만 추가했는데 이것이 작동합니다. 나는 질문이있다. 내 프레임 워크에서 SQLite 데이터베이스를 관리하는 클래스를 만들었으므로 libsqlite3.dylib에 대한 링크가 필요합니다. 내 응용 프로그램에서이 새 링커 플래그를 사용하여 프레임 워크를 추가 할 때 libsqlite3.dylib를 링크하지 않은 사실로 인해 컴파일 오류가 발생합니다. 이미 프레임 워크에 링크되어 있어도 (분명히 알 수 없습니다. 충분히). 어쩌면 내가 뭔가를 놓치고있어 ... – Niko

+0

이것은 아마도 별도의 질문으로 간주됩니다. 일반적으로 응용 프로그램에서 종속 라이브러리를 명시 적으로 링크해야합니다. 사용자 정의 프레임 워크를 링크하면 종속 라이브러리를 가져 오는 것이 좋지만 이렇게하는 방법은 없다고 생각합니다. –

3

당신은 빌드 설정에서 -ObjC에 다른 링커 플래그를 추가해야합니다. 문제가 해결되지 않으면, 당신은 @Ell 닐 가지 설명 -ObjC 및 -all_load 옵션에 대해 설명이 technical Q&A 한 번 봐 당신의 AppDelegate.m

+0

빠른 답변 감사드립니다. 나는 이미 그것을했습니다 : 동일한 문제. – Niko

+1

이 답변이 맞다고 생각합니다. 활성 깃발에이 두 깃발을 모두 추가 했습니까? 때로는 그것들을 프로젝트에 추가하고 대상에서 상속하는 것을 잊어 버렸습니다. 그래서 내가 내 범주를 보지 못했습니다. – lawicko

+0

@lawicko : 예, 해당 옵션을 대상에 추가했습니다. 편집 한 게시물을 살펴보십시오. – Niko

1

를 추가하려고 .

참고 링커 옵션 하지 틀 자체 틀 (프레임 워크, 즉, 클라이언트)에 연결되는 프로젝트에 설정 될 필요가있다. 왼쪽의 소스 파일 NString+Extensions.m을 볼 수 있기 때문에 스크린 샷에서 프레임 워크 프로젝트의 옵션을 설정하는 것처럼 보입니다.

+1

이렇게하지 않으면 크래시가 아닌 빌드 경고 만 발생합니다. –

+0

AppDelegate.m에서 #import 를 추가했습니다. CUtils 내 프레임 워크 이름입니다, CUtils.h 내 프레임 워크 (NSString + Extensions.h 포함)에 포함 된 모든 헤더 파일의 # import가 포함되어 있습니다 – Niko

+0

난 당신이 모든 h 파일을 필요합니다 믿습니다 –

관련 문제