首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么[NSMutableString stringWithString:@“”)工作?

为什么[NSMutableString stringWithString:@“”)工作?
EN

Stack Overflow用户
提问于 2011-12-01 15:55:32
回答 4查看 1.5K关注 0票数 7

只是想知道:

NSString中有一个名为+stringWithString:的静态方法。这在NSMutableString中不会被重新声明/重写,因此我们不能假设这将返回一个NSMutableString。实际上,即使在NSString类中,返回类型也被定义为iddoc状态

返回值 通过从aString复制字符而创建的字符串。

在我的知识中,我遗漏了目标C的哪些部分,以理解为什么这样做并返回一个NSMutableString?特别是因为基类NSString不知道我们想要一个可变字符串作为回报。

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

所有这些类方法是否在子类中重新实现?如果是的话,为什么没有记录在案呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-01 17:50:46

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

更确切地说,这是一种类方法。

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

在可可中,子类不需要重新声明该方法。事实上,它只会产生很大的噪音(IMO)。它只需要重新定义方法来提供它的自定义实现。

因此,我们不能假设这将返回一个NSMutableString。

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

在我的知识中,我遗漏了目标C的哪些部分,以理解为什么这样做并返回一个NSMutableString?特别是因为基类NSString不知道我们想要一个可变字符串作为回报。

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

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

这不应该是猜测。在这种情况下,如果返回了一个不可变的字符串,则应该提交一个bug。否则,无论它们使用的是一个定义还是多个定义,它都可以像广告中所指出的那样工作。

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

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

这种执行可以采取以下形式:

代码语言:javascript
复制
@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
    // self is either +NSString or +NSMutableString
    return [[[self alloc] initWithString:arg] autorelease];
}

尽管经常会出现异常,而且常常是优化的不可变/可变类型的情况:

代码语言:javascript
复制
@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];
}
...

如果是的话,为什么没有记录在案呢?

如果惟一的区别是您所请求的类类型,则不应重新声明或重新记录它们,除非它们与基类或特殊注释有一些偏差--即使在这种情况下,最好还是使用另一个名称创建一个方法。

票数 6
EN

Stack Overflow用户

发布于 2011-12-01 16:02:53

NSMutableStringNSString的一个子类,因此可以期望在NSMutableString上调用的任何方法都能正常工作,并在有意义时返回NSMutableString。不过,想到的唯一方法是copy,它按照惯例返回一个不可变的实例。

这就是为什么初始化器方法返回id而不是具体实例的原因,以及为什么所有类方法都应该使用[self alloc]而不是[MYActualClass alloc]

票数 3
EN

Stack Overflow用户

发布于 2011-12-01 16:16:18

您可以编写初始化器,如下所示:

代码语言:javascript
复制
+ (id) stringWithString: (NSString*) foo
{
    return [[self alloc] initWithString:foo];
}

现在,当您在NSString上调用这个初始化器时,[self alloc]返回NSString并得到NSString的一个实例。但是当您调用[NSMutableString stringWithString:@"…"]时,[self alloc]消息的结果是NSMutableString,因此初始化器返回一个可变字符串。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8344240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档