对某些人来说这听起来可能很奇怪..但我只是继续问这个...... 显然,没有人愿意这样做......但只是为了让这个概念更加清晰,我想问一下。 通常我们这样做:
NSString *myString=[[NSString alloc]init];
NSString *myString=[NSString string];
据我了解,它给出了NSString
类的指针对象,但是,如果我这样做会怎么样:
NSString *myString=[[NSMutableString alloc]init];
NSString *myString=[NSMutableString string];
如果发生这种情况,“字符串”实际属于什么类?并且因为我用可变类初始化它,可以我将NSMutableString类的消息发送到“myString”,这是一个对象NSString类 ??无论情况如何,我都知道这背后的概念是什么......也就是说,这可以是数组,字典甚至许多其他的calsses。
答案 0 :(得分: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:这不仅适用于可变/不可变对象,也适用于所有专业化类
答案 1 :(得分: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
接口公开的消息。