1

这对某些人来说可能听起来很奇怪.. 但我只是继续问这个.. 显然,没有人愿意这样做.. 但只是为了让概念更清晰,我想问一下。通常我们这样做:

NSString *myString=[[NSString alloc]init];
NSString *myString=[NSString string];

据我了解,它提供了一个NSString类的指针对象,但是,如果我这样做怎么办:

NSString *myString=[[NSMutableString alloc]init];
NSString *myString=[NSMutableString string];

如果发生这种情况,“string”实际上属于哪种类..并且由于我已经使用可变类对其进行了初始化,我可以将 NSMutableString 类的消息发送到“myString”,它是 NSString 类的对象 吗?无论是什么情况,我都可以知道这背后的概念是什么……而且,这可能是数组、字典甚至许多其他类的情况。

4

2 回答 2

2

是的。您的对象的类型将是 alloc 方法使用的类型。如果您使用 NSMutableString 进行分配,那么您的对象将是 NSMutableString 类的成员。

NSString *myString=[[NSMutableString alloc]init];

这是怎么回事,你有一个指向分配对象的指针,它的类型是它的父类,所以编译器不会看到 NSMutableString 的方法,如果你尝试直接调用它们,就会收到警告。

但同样,您的对象仍然是 NSMutableString 类的成员,它将响应 NSMutableString 类的消息。

即使您将 myString 声明为指向 NSString 的指针,您也可以执行此测试以了解我在说什么:

BOOL test = [myString isKindOfClass:[NSMutableString class]]; //this will hold true

您甚至可以执行强制转换来显式调用方法。

NSString *myString=[[NSMutableString alloc]init];
[(NSMutableString*)myString someNSMutableStringSpecificMethod];

PS:这不仅适用于可变/不可变对象,而且适用于所有专业化类

于 2013-07-31T12:34:14.967 回答
0

第二行发生的是你得到一个NSMutableString对象,但引用是一个NSString,你只能在引用的公开接口上调用消息,因此消息将被发送到你的NSMutableString对象,但只有公开的接口NSString是可见的。

但是,您可以随时将其转换NSMutableString为例如:

[((NSMutableString *)myString) appendString:@"anotherString"] // This works because of the cast

[myString appendString:@"anotherString"] // Compiler complains because it does not find that method in NSString interface.

并发送NSMutableString接口暴露的消息。

于 2013-07-31T12:33:54.453 回答