假设我有一个声明为:
的类@class SomeClass
@interface SomeClass: NSObject {
NSString *myString;
NSString *yourString;
}
@end
后来,在其他一些代码中我说:
SomeClass *myClass = [[SomeClass alloc] init];
SomeClass如何知道要分配多少内存,因为它没有覆盖+ alloc?据推测,它需要存储ivars myString和yourString,但它使用的是继承自NSObject的+ alloc。是否有参考资料涵盖这些细节?
答案 0 :(得分:14)
+alloc
就像其他任何类方法一样。 NSObject中的默认实现使用class_getInstanceSize()
来获取应分配的实例大小。实例大小是基于每类(没有继承)编译时结构大小和每个运行时计算类和所有超类的总大小的组合来确定的。这就是64位和iPhone运行时非易碎iVars的可能性。
在调用初始化程序之前,某些类(特别是类集群)实际上并不执行真正的实例分配(这就是在初始化方法中执行self = [super init]
很重要的原因)。
答案 1 :(得分:4)
+[NSObject alloc]
解析为对Objective-C运行时的调用,该运行时知道每个类的大小。
答案 2 :(得分:4)
答案 3 :(得分:-2)
alloc
方法在创建新对象时执行相当于sizeof
的操作。此外,myString
和yourString
实例变量实际上没有太多存储空间:它们只是指针,因此alloc
只分配足够的内存来保存地址。