gpt4 book ai didi

objective-c - 为什么 [NSMutableString stringWithString : @""] work?

转载 作者:太空狗 更新时间:2023-10-30 03:35:42 25 4
gpt4 key购买 nike

只是想知道:

NSString 中有一个名为+stringWithString: 的静态方法。这在 NSMutableString 中没有被重新声明/覆盖,所以我们不能假设这将返回一个 NSMutableString。事实上,即使在 NSString 类中,返回类型也被定义为 iddoc states :

Return Value
A string created by copying the characters from aString.

在我的知识中我缺少 Objective-C 的哪一部分来理解为什么它有效并返回一个 NSMutableString?特别是因为基类 NSString 不知道我们需要一个可变字符串作为返回。

可以说在内部 [Class alloc] 被调用,它会生成一个类型为 NSMutableString 的对象,但即使这也纯属猜测,因为我们没有源代码code 和 stringWithString: 可以在内部做任何它想做的事情。

所有那些类方法都在子类中重新实现了吗?如果是,为什么没有记录下来?

最佳答案

In NSString there is a static method called +stringWithString:.

更恰本地说,它是一个类方法。

This is not redeclared/overridden in NSMutableString

在 cocoa 中,子类不需要重新声明方法。事实上,它只会产生很多噪音(IMO)。它只需要重新定义方法以提供其自定义实现。

so we cannot assume that this will return an NSMutableString.

我们必须假设它将返回一个可变字符串。子类可以根据需要重新定义其初始化器和便捷构造器以满足所需的契约,而无需公开重新声明该方法——它只需要在基类的实现不充分时定义该方法。

What part of objective C am I missing in my knowledge to understand why this works and returns an NSMutableString? Especially because the base class NSString is not aware that we want a mutable string in return.

它“知道”是因为你写的是 [NSMutableString stringWithString:@"bah"] 而不是 [NSString stringWithString:@"bah"]。与实例方法一样,类方法有一个隐式的 self 允许它们通过类方法传递类型。因此,可以根据需要重新定义/覆盖类方法。类方法也可以使用 self 来确定或消息它们的类型(示例很快)。

One could say that internally [Class alloc] is called which will generate an object of type NSMutableString, but even this is pure guesswork as we do not have the source code and stringWithString: could do whatever it wants internally.

这不应该是猜测。在这种情况下,如果您返回一个不可变 字符串,您应该提交错误。否则,无论他们是否使用一个或多个定义,它都会像宣传的那样工作。

Are all those class methods reimplemented in the subclass?

在便利构造函数的情况下,更常见的是通过指定的初始化程序之一:

这样的实现可以采用以下形式:

@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
// self is either +NSString or +NSMutableString
return [[[self alloc] initWithString:arg] autorelease];
}

尽管经常会发生异常,而且优化的不可变/可变类型通常就是这种情况:

@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
return [arg imp_isMutable] ? [[[self alloc] initWithString:arg] autorelease] : arg;
}
...
@implementation NSMutableString
+ (id)stringWithString:(NSString *)arg
{
return [[[self alloc] initWithString:arg] autorelease];
}
...

And if yes why isn't this documented?

当唯一的区别是您请求的类类型时,它们不应该被重新声明或重新记录,除非它们与基类有一些偏差或特​​殊说明——即使在那种情况下,最好创建一个方法用另一个名字。

关于objective-c - 为什么 [NSMutableString stringWithString : @""] work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344240/

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