使用不可变类分配任何可变对象,反之亦然

时间:2013-07-31 12:28:51

标签: ios objective-c allocation nsmutablestring

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

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

据我了解,它给出了NSString类的指针对象,但是,如果我这样做会怎么样:

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

如果发生这种情况,“字符串”实际属于什么类?并且因为我用可变类初始化它,可以我将NSMutableString类的消息发送到“myString”,这是一个对象NSString类 ??无论情况如何,我都知道这背后的概念是什么......也就是说,这可以是数组,字典甚至许多其他的calsses。

2 个答案:

答案 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接口公开的消息。