2012-01-31 30 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の宇根CHAINE AVEC DEScaractèresspéciaux01​​2012-01-31 17:01:09.924 TestCUtils [4782:207] - [__ NSCFConstantString removeDiacritics]:認識されていないセレクタが

しかし、私は私のクラスの拡張機能を追加した場合、直接インスタンス0x340cに送信アプリケーション(フレームワーク外)で、正常に動作します...

何かヒント?

** EDIT **

あなたのいくつかが尋ねてきたように、私は-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ファイルを必要とすると信じています –

関連する問題