Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c [NSMutableString stringWithString:@";]为什么工作?_Objective C_Nsstring_Nsmutablestring - Fatal编程技术网

Objective c [NSMutableString stringWithString:@";]为什么工作?

Objective c [NSMutableString stringWithString:@";]为什么工作?,objective-c,nsstring,nsmutablestring,Objective C,Nsstring,Nsmutablestring,只是想知道: 在NSString中有一个名为+stringWithString:的静态方法。 这不会在NSMutableString中重新声明/重写,因此我们不能假设这将返回NSMutableString。事实上,即使在NSString类中,返回类型也定义为id,并且: 返回值 通过从aString复制字符创建的字符串 在我的知识中,我遗漏了目标C的哪一部分来理解为什么这样做并返回一个NSMutableString?特别是因为基类NSString不知道我们想要一个可变字符串作为回报 可以说在内部

只是想知道:

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

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

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

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


所有这些类方法都在子类中重新实现了吗?如果是,为什么没有文档化?

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


这就是为什么您的初始值设定项方法返回
id
而不是具体实例,以及为什么所有类方法都应该使用
[self alloc]
而不是
[MYActualClass alloc]
您可以这样编写初始值设定项:

+ (id) stringWithString: (NSString*) foo
{
    return [[self alloc] initWithString:foo];
}
现在,当您在
NSString
上调用此初始值设定项时,
[self alloc]
返回
NSString
并返回
NSString
的实例。但是,当您调用
[NSMutableString stringWithString:@“…”
时,
[self alloc]
消息的结果是
NSMutableString
,因此初始值设定项返回一个可变字符串

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

更恰当地说,它是一种类方法

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

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

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

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

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

它“知道”是因为您编写了
[nsmutablestringwithstring:@“bah”]
而不是
[nsstringwithstring:@“bah”]
。与实例方法一样,类方法有一个隐式的
self
,允许它们通过类方法传递类型。因此,可以根据需要重新定义/重写类方法。类方法也可以使用
self
来确定或传递它们的类型(下面的示例)

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

这不应该是猜测。在这种情况下,如果返回一个不可变字符串,您应该提交一个bug。否则,无论他们是否使用了一个或多个定义,它都会按照广告的方式工作

所有这些类方法都在子类中重新实现了吗

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

这种实施可以采取以下形式:

@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];
}
...
如果是,为什么没有记录

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

(Justin说了什么,但需要澄清)

在NSString中有一个名为+stringWithString:的静态方法。这 未在NSMutableString中重新声明/重写,因此我们无法假定 这将返回一个NSMutableString。事实上,即使在NSString中 类返回类型定义为id

首先,Objective-C没有静态方法。Objective-C有类方法。类方法的行为与实例方法(其中类是元类的实例)完全相同,并且可以被继承、重写等

因此,正如
NSMutableString
继承
characterAtIndex:
并可以重写它以执行特殊操作一样,如果需要,
NSMutableString
也可以对类方法执行同样的操作


还请注意,类不需要在头中声明它从其超类重写的方法。框架中的类通常不会显式声明被重写的方法,因为被重写的方法的行为应该与父类完全相同,但会被重写以在子类的需求上下文中工作。

我想您重复了我的部分假设(“self”部分),但归根结底,所有类方法都必须