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

时间:2017-05-23 16:34:45

标签: objective-c cocoa

我想看看在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];
}

但我不确定它是否与Cocoa相同。

我想看看实现,所以我可以确认运行时。由于appendFormat用于可变字符串,我假设appendFormat的运行时最坏情况为O(n)并且分摊O(1),但我不确定。

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

1 个答案:

答案 0 :(得分: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);
}

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

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