5

指定した引数ごとに値をエンコードするNSTask呼び出しのようです。-[NSString fileSystemRepresentation]

-fileSystemRepresentationこれは、 が分解された Unicode 形式を使用してエンコードするため、状況によっては問題になる可能性があります。 、U + 00E4(分音符付きのラテン小文字a)とは対照的です。一方-UTF8String、方法は逆のようです。

NSTask合成フォームを使用して引数をエンコードする必要があります。この問題を回避するにはどうすればよいですか?

4

1 に答える 1

4

考えられる解決策は、サブクラスNSString化して の独自の実装を提供することです-fileSystemRepresentationが、残念ながらNSStringはクラス クラスタであるため、サブクラス化が非常に困難です (Apple のドキュメントでも推奨されていません)。

ただし、 を装う別のクラスを作成できますNSStringが、 の独自の実装を提供します-fileSystemRepresentation

NSTaskただし、これは、引数オブジェクトのクラス ID に何かを行うと、問題を引き起こす可能性があります。現在、これが事実であるという証拠はありません — この回避策は完全に機能しているようです。

ヘッダ:

// 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
于 2013-08-27T07:57:30.320 に答える