gpt4 book ai didi

ios - 我如何实现与苹果集群模式相同的行为(NSString 和 NSCFString)

转载 作者:行者123 更新时间:2023-11-29 02:33:42 27 4
gpt4 key购买 nike

我只是为了测试目的编写了以下代码:

NSString *aStr = [[NSString alloc] initWithFormat:@"Foo"];
aStr = [aStr initWithFormat:@"Bar"];//Crashed here

我收到以下错误:

*** initialization method -initWithFormat:locale:arguments: cannot be sent to an abstract object of class __NSCFString: Create a concrete instance!

如果我写下面的代码会发生同样的事情

NSString *aStr = [NSString alloc];
aStr = [aStr initWithFormat:@"Foo"];
aStr = [aStr initWithFormat:@"Bar"]; //Crashed here

通过谷歌我了解到 initWithFormat 将返回 NSCFString 对象。我的问题是,如果 NSCFStringNSString 的派生类,那么为什么我无法调用 NSCFString 上的 initWithFormat 方法。如果可以停止可见性,我如何在代码中实现而不覆盖 NSCFString(派生类)中的方法。

简单来说,如果 NSCFString 是 NSString 的派生类,那么为什么我不能调用它的基类 (initWithFormat) 方法?

最佳答案

我相信发生的事情是 [NSString initWithFormat:] 方法注意到您没有提供任何格式说明符,因此没有需要构建的 NSString 对象, 所以它只是返回你传入的常量 NSString 对象 (@"Foo"):

NSString *aStr = [NSString alloc];
aStr = [aStr initWithFormat:@"Foo"];

所以 aStr 现在是 NSCFString 类型。这是崩溃的原因:

aStr = [aStr initWithFormat:@"Bar"]; //Crashed here

但是,您永远不应该在现有对象上调用 init 方法,因此要更正崩溃,请使用:

aStr = [[NSString alloc] initWithFormat:@"Bar"];

并像您一样使用格式说明符:

aStr = @"Foo";
aStr = @"Boo";

这是同一件事,只是更清晰,使用的代码更少,性能更好。

关于ios - 我如何实现与苹果集群模式相同的行为(NSString 和 NSCFString),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26606289/

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