【问题标题】:In Objective-C, how does +alloc know how much memory to allocate?在 Objective-C 中,+alloc 如何知道要分配多少内存?
【发布时间】:2010-11-25 03:57:57
【问题描述】:

假设我有一个类声明为:

@class SomeClass

@interface SomeClass: NSObject {
  NSString *myString;
  NSString *yourString;
}

@end

后来,我在其他一些代码中说:

SomeClass *myClass = [[SomeClass alloc] init];

如果 SomeClass 没有覆盖 +alloc,它如何知道要分配多少内存?大概它需要存储 ivars myString 和 yourString,但它使用从 NSObject 继承的 +alloc。是否有涵盖这些细节的参考资料?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    +alloc 和其他方法一样只是一个类方法。 NSObject 中的默认实现使用class_getInstanceSize() 来获取应该分配的实例大小。实例大小是根据每个类(无继承)编译时结构大小和每个运行时计算类和所有超类的总大小的组合来确定的。这就是非脆弱 iVar 在 64 位和 iPhone 运行时中的可能方式。

    某些类,尤其是类集群,在调用初始化程序之前实际上不会进行真正的实例分配(这就是为什么在初始化程序方法中执行self = [super init] 很重要)。

    【讨论】:

    • 什么是类簇?这是我应该更熟悉的 Objective-C 术语吗?
    • NSString 是一个类簇,例如。当你创建一个 NSString 时,你实际上会得到一个经过优化的子类的实例来处理该特定类型的字符串。
    【解决方案2】:

    +[NSObject alloc] 解析为对 Objective-C 运行时的调用,它知道每个类的大小。

    【讨论】:

      【解决方案3】:

      Mike Ash 写了一篇文章来描述其中的一些工作原理:

      Friday Q&A 2009-03-13: Intro to the Objective-C Runtime

      【讨论】:

        【解决方案4】:

        alloc 方法在创建新对象时相当于sizeof。此外,myStringyourString 实例变量并没有太多的存储空间:它们只是指针,所以 alloc 只是分配了足够的内存来保存地址。

        【讨论】:

        • 它没有; sizeof 是仅编译时的操作。分配大小在运行时确定。
        • 是的,myString 和 yourString 没有太多存储空间,但它们有一些,而且很重要,必须分配到某个地方。
        • myString 和 yourString 都是 SomeClass 中指针的大小。
        • @bbum,我知道,我在回复 Quartz。
        • 我知道sizeof是编译时操作; Objective-C 对sizeof 执行类似的检查。
        猜你喜欢
        • 2016-07-07
        • 2010-12-30
        • 1970-01-01
        • 2012-02-12
        • 2011-01-20
        • 2017-01-20
        • 2014-03-01
        • 1970-01-01
        相关资源
        最近更新 更多