我可以查看Objective-C中appendFormat实例方法的实现吗?

use*_*510 0 cocoa objective-c

我想看看如何appendFormat在Objective-C中实现:

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

- (void)appendFormat:(NSString *)format, ...;
Run Code Online (Sandbox Code Playgroud)

有没有办法看一下实现?

我找到了这个:

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];
}
Run Code Online (Sandbox Code Playgroud)

但我不确定是否与可可粉相同。

我想查看实现,以便可以确认运行时。由于appendFormat是用于可变字符串,因此我假设appendFormat的运行时是最坏的情况O(n)和摊销O(1),但我不确定。

(我不是Objective-C开发人员。)

rob*_*off 5

您看不到其源代码,-[NSMutableString appendFormat:]因为它在Apple之外不可用。

您可以反汇编Foundation框架以查看实现。我做到了(使用Hopper),实现基本上可以做到这一点:

- (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);
}
Run Code Online (Sandbox Code Playgroud)

如果查看的反汇编initWithFormat:locale:arguments:,则可以看到它的调用_CFStringCreateWithFormatAndArgumentsAux2此处的源代码(来自macOS 10.10.5)可在此处获得。最终,您会发现自己__CFStringAppendFormatCore在同一文件中的。此函数解释格式字符串。

您将必须拆卸CoreFoundation才能找到的实现replaceCharactersInRange:withString:。它只是调用__CFStringCheckAndReplace,它在我上面链接的同一CoreFoundation源文件中定义。您可以从那里向下钻取并最终发现,当CoreFoundation需要扩展为字符串分配的存储时,每次这样做的比例都是3/2。这是指数增长,因此花费的总时间replaceCharactersInRange:withString:为O(n)。