2013-08-27 44 views
3

看起來NSTask調用-[NSString fileSystemRepresentation]來爲您給出的每個參數編碼值。如何解決NSTask調用 - 用於參數的[NSString fileSystemRepresentation]

這可以成爲在某些情況下的一個問題是由於這樣的事實:-fileSystemRepresentation器使用分解的unicode形成:例如,一個變音符(A)將被編碼爲U + 0061(小寫拉丁字母a)和U + 0308(結合diaeresis),而不是U + 00E4(帶分音符的拉丁小寫字母)。另一方面,方法-UTF8String似乎正好相反。

我需要我的NSTask參數使用組合形式進行編碼。我該如何解決這個問題?

回答

2

一個可能的解決方案是繼承NSString,並提供自己實現-fileSystemRepresentation,可惜NSString是一類集羣,從而子非常困難(這也是蘋果的文檔灰心)。

但是,我們可以創建一個單獨的類設置爲NSString,但它提供了自己的-fileSystemRepresentation實現。

但是,如果NSTask對參數對象的類標識做任何事情,這可能會產生問題。目前我沒有證據表明這種情況 - 這種解決方法似乎完美。

部首:

// MYTaskArgument.h 

@interface MYTaskArgument : NSObject 
+ (instancetype) taskArgumentWithString:(NSString *)str; 
@end 

實現:

// MYTaskArgument.m 

@interface MYTaskArgument() 
@property(copy) NSString *string; 
@end 

@implementation MYTaskArgument 

+ (instancetype) taskArgumentWithString:(NSString *)str { 
    MYTaskArgument *ret = [[MYTaskArgument alloc] init]; 
    ret.string = str; 
    return ret; 
} 

- (const char *) fileSystemRepresentation { 
    return self.string.UTF8String; 
} 

- (id) forwardingTargetForSelector:(SEL)aSelector { 
    return self.string; 
} 

@end