Objective-C运行时的hashtable2.mm
文件包含以下代码:
static void bootstrap (void) {
free(malloc(8));
prototypes = ALLOCTABLE (DEFAULT_ZONE);
prototypes->prototype = &protoPrototype;
prototypes->count = 1;
prototypes->nbBuckets = 1; /* has to be 1 so that the right bucket is 0 */
prototypes->buckets = ALLOCBUCKETS(DEFAULT_ZONE, 1);
prototypes->info = NULL;
((HashBucket *) prototypes->buckets)[0].count = 1;
((HashBucket *) prototypes->buckets)[0].elements.one = &protoPrototype;
};
为什么它会立即分配并释放8字节的空间?
另一个混淆的来源是objc-os.h
:的这种方法
static __inline void *malloc_zone_malloc(malloc_zone_t z, size_t size) { return malloc(size); }
虽然它只使用一个参数,但签名是否要求两个参数?
对于第一个问题,我只能假设。我敢打赌,这样做是为了避免/减少内存流失,或者出于其他原因对内存进行分段。你可以在bmalloc
的变更日志中简要地找到它的讨论位置(这不是很相关,但我找不到更好的参考(:
2017-06-02杰弗里·加伦<ggaren@apple.com>
针对新API进行了更新。请注意,我们每页缓存一个可用区块班当您
free(malloc(X))
然而,尚不清楚内存流失是由这种技术引起的,还是应该解决它。
对于第二个问题,Objective-C运行时曾经使用";区域";为了通过破坏所述区域来破坏所有分配的变量,但事实证明它很容易出错,后来同意不再使用它。然而,API由于历史原因(我想是向后兼容性(仍然使用它,但表示区域被忽略:
区域在iOS上被忽略,在OS X上被忽略64位运行时。您不应该在当前开发中使用区域。