gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:29:57 26 4
gpt4 key购买 nike

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

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 开发人员。)

最佳答案

您看不到 -[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)。

关于objective-c - 我可以查看Objective-C中appendFormat实例方法的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com