2012-09-10 11 views
10

私はNSStringカテゴリクラス(NSString+URLEncoding.h)を持っています。 カテゴリメソッドを呼び出す文字列がiOSによってNSCFConstantStringに最適化されているため、不明なセレクタクラッシュが発生しています。私はからのiOS 5でNSCFConstantStringNSCFStringの最適化を知ったiOS 5:Make NSString CategoryにはNSCFConstantStringが含まれていますか?

-[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174 

http://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/

は、私は定数文字列が含まれるようにNSStringのカテゴリを取得したりさえするVARを強制する方法を知って誰ですNSString/NSCFStringで、NSCFConstantStringではありませんか?

乾杯、 Z

-edit-

  • リンカーフラグ-ObjC -all_loadは既に
  • NSStringの+ URLEncoding.mがターゲットに含まれて実装されている両方のソース
  • NSStringの+ URLエンコードをコンパイル。 mはURLEncodedStringメソッドを実装します。
  • ゾンビを確認しました。

IはShareKit 2.0

ヘッダに共有サービスを追加しています:

@interface NSString (OAURLEncodingAdditions) 

- (NSString *)URLEncodedString; 

が実装:

@implementation NSString (OAURLEncodingAdditions) 

- (NSString *)URLEncodedString 
{ 
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                      (CFStringRef)self, 
                      NULL, 
                      CFSTR("!*'();:@&=+$,/?%#[]"), 
                      kCFStringEncodingUTF8); 
    [result autorelease]; 
    return result; 
} 
+0

解決済みですか?もしそうでなければ、私はあなたが必要な場合はそれを解決しようとすることができますか? –

+0

あなたがリンクしているブログの '__NSCFConstantString'は赤ちゃんです。ブログの問題は、サブクラス化とは関係がありません.Appleがすべての空の文字列を1つのオブジェクトに最適化しようとしているという事実とは関係ありません。空の文字列を表す1つのオブジェクトが単純な「NSString」だった場合、ブログのコードは依然として壊れていました。 – JeremyP

答えて

11

デッドコードストリッピングがobj-cカテゴリのみを含む(または参照されていない)オブジェクトファイルを完全に省略することがあるリンカに問題があります。理論的には、-ObjCフラグをリンカーに渡してこれを修正する必要がありますが、それは常に機能するとは限りません。この問題を回避するには、-all_loadリンカフラグを指定します。これにより、リンカは常にすべてのオブジェクトファイルにリンクします。

カテゴリがサブプロジェクトやライブラリの一部である場合は、親プロジェクトに-all_loadを設定する必要があることに注意してください。

+0

が編集されました。もう一度ご覧ください。 –

+0

正確には、これは私のために働く。ありがとうございました... :) –

2

__NSCFConstantStringNSStringのサブクラスであるので、NSString上の任意のカテゴリが適用__NSCFConstantStringにも。

あなたのカテゴリにリンクしていないか、カテゴリに@implementationURLEncodedStringメソッドが定義されていません。

+0

が編集されました。もう一度ご覧ください。 –

4

ちょうど同じ問題が30分発生しました。リンカを試してみたところ、カテゴリが存在しないことがわかりましたコンパイルソースリストに私のターゲットのビルドフェーズ。確認してください。

+0

特に複数のターゲットがある場合、複数のターゲットに新しい追加ファイルを追加するのを忘れた場合、この問題が発生する可能性があります。 – UnchartedWorks

関連する問題