为什么[NSMutableString stringWithString:@""]有效?

Jor*_*ans 7 objective-c nsstring nsmutablestring

就是想:

NSString那里有一个名为的静态方法+stringWithString:.这不会被重新声明/覆盖,NSMutableString因此我们不能假设这将返回NSMutableString.事实上,即使在NSString类中,返回类型也被定义为id,doc指出:

返回值
通过复制字符创建的字符串aString.

在我的知识中,我缺少什么目标C才能理解为什么这会起作用并返回NSMutableString?特别是因为基类NSString不知道我们想要一个可变字符串作为回报.

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

是否所有这些类方法都在子类中重新实现?如果是,为什么不记录这个?

jus*_*tin 6

在NSString中有一个名为+ stringWithString的静态方法:

更合适的是,它是一种类方法.

这不会在NSMutableString中重新声明/重写

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

所以我们不能假设这会返回一个NSMutableString.

我们必须假设它将返回一个可变字符串.子类可以根据需要重新定义其初始化器和便捷构造器,以便在不公开重新声明方法的情况下满足所需的合同 - 它只需要在基础实现不足时定义方法.

在我的知识中,我缺少什么目标C来理解为什么这会起作用并返回一个NSMutableString?特别是因为基类NSString不知道我们想要一个可变字符串作为回报.

它'知道',因为你写的[NSMutableString stringWithString:@"bah"]而不是[NSString stringWithString:@"bah"].与实例方法类似,类方法具有隐式self,允许它们通过类方法传递类型.因此,可以根据需要重新定义/重写类方法.类方法也可self用于确定或消息其类型(例如,简短).

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

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

是否所有这些类方法都在子类中重新实现?

在便捷构造函数的情况下,通过一个指定的初始值设定项更为常见:

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

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

虽然通常可以进行异常,并且通常是优化的不可变/可变类型的情况:

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

如果是,为什么不记录这个?

当唯一的区别是你要求的类类型时,它们不应该被重新声明或重新编写,除非它们与基类或特殊注释有一些偏差 - 即使在这种情况下,最好用另一个名称创建一个方法.