2012-09-10 62 views
10

我有一個NSString類別類(NSString+URLEncoding.h)。 我遇到和未知的選擇器崩潰,因爲我稱爲類別方法的字符串已被iOS優化爲NSCFConstantStringiOS 5:使NSString類別包括NSCFConstantString?

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

我學到了NSCFConstantString對比的NSCFString優化iOS 5中的: http://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/

是任何人都知道我怎樣才能得到NSString的類別包括常量字符串,甚至迫使VAR是一個NSString/NSCFString而不是一個NSCFConstantString

乾杯, ž

CNC中

  • 連接標誌-ObjC -all_load都已經實現了
  • 的NSString + URLEncoding.m包括在目標編譯源代碼
  • 的NSString + URL編碼。 m實現了URLEncodedString方法。
  • 檢查殭屍。

我增加了共享服務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試圖將所有空字符串優化爲一個對象有關。如果一個表示空字符串的對象是一個簡單的'NSString',博客的代碼仍然會被破壞。編輯 – JeremyP

回答

11

鏈接器存在一個問題,可能會導致其死代碼剝離,從而完全忽略僅包含obj-c類別(或其他未引用的對象)的任何對象文件。理論上將-ObjC標誌傳遞給鏈接器應該解決這個問題,但這似乎並不總是奏效。您可以通過提供-all_load鏈接器標記來解決此問題,這會導致鏈接器始終鏈接到所有對象文件中。

請注意,如果您的類別是某個子項目或庫的一部分,則可能必須在父項目上設置-all_load

+0

,可否請再看一下? –

+0

確實,這對我有用。謝謝...... :) –

2

__NSCFConstantStringNSString一個子類,等等NSString任何類別的申請到__NSCFConstantString

要麼你不鏈接你的類別,要麼你的類別沒有在其@implementation中定義URLEncodedString方法。

+0

,可否請再看看?編輯 –

4

剛剛花了30分鐘搞清楚完全相同的問題。在鏈接器擺弄後,我發現這個類別不存在於我的目標的構建階段中的編譯源列表中。一定要檢查它在那裏。

+0

特別是當你有多個目標時,如果你忘了添加新的文件到多個目標,它可能會導致這個問題。 – UnchartedWorks