2017-05-23 18 views
0

私はappendFormatをObjective-Cで実装されている方法を見てみたい:Objective-CでappendFormatインスタンスメソッドの実装を表示できますか?

https://developer.apple.com/reference/foundation/nsmutablestring/1497308-appendformat

- (void)appendFormat:(NSString *)format, ...; 

は実装を参照する方法はありますか?

私はこれが見つかりました:

https://github.com/cjwl/cocotron/blob/master/Foundation/NSString/NSMutableString.m#L111

-(void)appendFormat:(NSString *)format,... { 
    NSString *string; 
    NSRange range={[self length],0}; 
    va_list arguments; 

    va_start(arguments,format); 

    string=NSAutorelease(NSStringNewWithFormat(format,nil,arguments,NULL)); 
    va_end(arguments); 

    [self replaceCharactersInRange:range withString:string]; 
} 

をしかし、私はそれはココアと同じだかはわかりません。

私はランタイムを確認できるように実装を見たいと思います。 appendFormatは可変文字列のため、appendFormatのランタイムは最悪の場合O(n)と償却O(1)と仮定していますが、わかりません。

(私はObjective-Cの開発者ではないです。)

答えて

4

それはアップルの外で利用可能ではありませんので、あなたが-[NSMutableString appendFormat:]のソースコードを参照することはできません。

実装を見るために、Foundationフレームワークを逆アセンブルすることができます。私は(ホッパーを使用して)やった、と実装は、基本的にはこれにうまくいく:

- (void) appendFormat:(NSString *)format, ... { 
    va_list ap; 
    va_start(ap, format); 
    NSString *string = [[NSString allocWithZone:nil] initWithFormat:format locale:nil arguments:ap]; 
    [self replaceCharactersInRange:NSMakeRange(self.length, 0) withString:string]; 
    va_end(ap); 
} 

あなたがinitWithFormat:locale:arguments:の解体を見れば、あなたはそれが_CFStringCreateWithFormatAndArgumentsAux2を呼び出すことがわかります。そのためのソースコード(MacOS 10.10.5から)はhereです。最終的には同じファイルの__CFStringAppendFormatCoreに自分自身が見つかります。この関数は、書式文字列を解釈します。

replaceCharactersInRange:withString:の実装を見つけるためにCoreFoundationを逆アセンブルする必要があります。ちょうど__CFStringCheckAndReplaceを呼び出します。これは上記のCoreFoundationソースファイルで定義されています。そこからドリルダウンして、最終的に、CoreFoundationが文字列に割り当てられたストレージを拡張する必要がある場合、毎回3/2の倍率で展開することができます。これは指数関数的な増加であるため、replaceCharactersInRange:withString:で費やされた合計時間はO(n)です。

関連する問題