objective-C:为什么接口类型不能静态分配?

use*_*180 2 interface objective-c

NSString s1;   //compile error: interface type cannot be statically allocated
NSString *s2   //good
Run Code Online (Sandbox Code Playgroud)

静态意味着该对象的内存是在编译时分配的?但是在运行时分配所有对象并通过指针访问的原因是什么?我知道指针允许更好地使用内存,例如将它们作为方法的参数传递,但为什么禁止静态分配?我是这种语言的新手,我想了解它的愿景.

Kir*_*ani 6

在C++中,除非有指向该对象的指针,否则不能有多态对象.Objective-C不允许你打开那些蠕虫.它是一种动态类型语言(如果你愿意,可以提供很多保护) - 并且在编译时锁定你的类型违背了语言的哲学.

NSString *s2 = [[NSString alloc] initWith ???];
Run Code Online (Sandbox Code Playgroud)

考虑那条线.你正在分配一个字符串对象(我故意将构造函数的细节留空).您将无法获得NSString的实际实例 - 您的对象类型将是私有子类.这个概念称为Class Clusters.

https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html

根据运行的构造函数以及传入的参数可能会影响运行时类型.对于静态分配的对象,这是不可能的.

当然,你的问题还有很多,但考虑到每个对象在运行时都是动态的,可以考虑所有可能的问题.还要考虑这避免的C++的复杂性.