2012-06-19 12 views
1

我寫了一個小的NSString類有更好的實現百分比爲逃避我的項目之一: @im的NSString類別爲百分之更好逃避

plementation NSString (Escaping) 
- (NSString *)stringByAddingSafePercentEscapesUsingEncoding:(NSStringEncoding)encoding 
{ 
    NSRange wholeString = NSMakeRange(0, [self length]); 
    NSMutableString *escaping = [NSMutableString stringWithString:[self stringByAddingPercentEscapesUsingEncoding:encoding]]; 
    [escaping replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"-" withString:@"%2D" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString]; 
    [escaping replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString]; 
    NSString *escaped = [NSString stringWithString:escaping]; 

    return escaped; 
} 
@end 

在這一個項目它的偉大工程,我愛用它。但是當我將它移植到另一個項目時,該代碼通過EXC_BAD_ACCESS。我能在代碼中做出更好的東西嗎?

+0

出了什麼問題['CFURLCreateStringByAddingPercentEscapes'](https://developer.apple.com/library/mac/documentation/CoreFOundation/Reference/CFURLRef/Reference/reference的.html#// apple_ref/C/FUNC/CFURLCreateStringByAddingPercentEscapes)? –

+0

我以前用過它。但我每次都得到(null)。但是我的類別有什麼問題?我原來的問題沒有解決...... –

回答

1

我才發現我的問題是偶然:

由於串有效改變其由三個字符,字符串的長度變化更換一個字符時長每次更換。所以對於該類別的正確實施將是:

@implementation NSString (Escaping) 
- (NSString *)stringByAddingSafePercentEscapesUsingEncoding:(NSStringEncoding)encoding 
{ 
    NSRange wholeString = NSMakeRange(0, [self length]); 
    NSMutableString *escaping = [NSMutableString stringWithString:[self stringByAddingPercentEscapesUsingEncoding:encoding]]; 
    [escaping replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"-" withString:@"%2D" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString]; 
    wholeString = NSMakeRange(0, [escaping length]); 
    [escaping replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString]; 
    NSString *escaped = [NSString stringWithString:escaping]; 

    return escaped; 
} 
@end 
0

我覺得應該是:withString:選項:範圍:方法迭代過去字符串中的最後一個字符

NSRange wholeString = NSMakeRange(0, [self length]-1); 

如果您replaceOccurrencesOfString你會得到「壞訪問」。

或者你可以使用類似這樣的替代方法,它已經在迭代整個長度。我不知道但是默認搜索選項是什麼:

escaping = [escaping stringByReplacingOccurencesOfString:@"$" withString:@"%24"]; 
+0

我以某種方式修復它。我想我通過導入或類似的東西實現了雙重實現。雖然你的實現不正確。 NSMutableString沒有選擇器'stringByReplacingOrrngncesOfString:withString',你也必須使用NSStringCompareOptions和NSRange。 –

+0

嗨朱利安, NSMutableString從具有該方法的NSString繼承。他們在10.5中添加了它。請參閱[Apple Docs](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html)。 – JiuJitsuCoder

+0

哇 - 我剛纔看到我忘了聲稱我在談論iOS,我真的很抱歉! :) –