只是想知道:
在NSString中有一个名为+stringWithString:的静态方法。这在NSMutableString中不会被重新声明/重写,因此我们不能假设这将返回一个NSMutableString。实际上,即使在NSString类中,返回类型也被定义为id和doc状态
返回值 通过从
aString复制字符而创建的字符串。
在我的知识中,我遗漏了目标C的哪些部分,以理解为什么这样做并返回一个NSMutableString?特别是因为基类NSString不知道我们想要一个可变字符串作为回报。
可以说,在内部调用[Class alloc],它将生成一个类型为NSMutableString的对象,但即使这样也是纯粹的猜测,因为我们没有源代码,stringWithString:可以在内部做它想做的任何事情。
所有这些类方法是否在子类中重新实现?如果是的话,为什么没有记录在案呢?
发布于 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。否则,无论它们使用的是一个定义还是多个定义,它都可以像广告中所指出的那样工作。
所有这些类方法是否在子类中重新实现?
在方便构造函数的情况下,更常见的情况是通过指定的初始化器之一:
这种执行可以采取以下形式:
@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];
}
...如果是的话,为什么没有记录在案呢?
如果惟一的区别是您所请求的类类型,则不应重新声明或重新记录它们,除非它们与基类或特殊注释有一些偏差--即使在这种情况下,最好还是使用另一个名称创建一个方法。
发布于 2011-12-01 16:02:53
NSMutableString是NSString的一个子类,因此可以期望在NSMutableString上调用的任何方法都能正常工作,并在有意义时返回NSMutableString。不过,想到的唯一方法是copy,它按照惯例返回一个不可变的实例。
这就是为什么初始化器方法返回id而不是具体实例的原因,以及为什么所有类方法都应该使用[self alloc]而不是[MYActualClass alloc]。
发布于 2011-12-01 16:16:18
您可以编写初始化器,如下所示:
+ (id) stringWithString: (NSString*) foo
{
return [[self alloc] initWithString:foo];
}现在,当您在NSString上调用这个初始化器时,[self alloc]返回NSString并得到NSString的一个实例。但是当您调用[NSMutableString stringWithString:@"…"]时,[self alloc]消息的结果是NSMutableString,因此初始化器返回一个可变字符串。
https://stackoverflow.com/questions/8344240
复制相似问题