NSZone 和 allocWithZone

一个面试题:问alloc和allocWithZone是什么?有啥子区别?

+ (instancetype)allocWithZone:(struct _NSZone *)zone 
+ (instancetype)alloc

(以下是我自己看了少部分资料自己意淫想象,不算严谨的正确观点,慎读。)

首先alloc和allocWithZone都是创建一个对象实例
使用alloc方法创建一个类的实例的时候,其实最后还是会调用 allocWithZone 方法。在OC中allocWithZone这个方法应该是弃用了的,只是由于历史原因苹果还保留着这个函数。

这个NSZone是个什么东西呢

据史料记载,NSZone是用来分配和管理一段内存空间的一个结构体。
然后我们查看NSZone的头文件发现以下几个函数

FOUNDATION_EXPORT NSZone *NSCreateZone(NSUInteger startSize, NSUInteger granularity, BOOL canFree) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");

FOUNDATION_EXPORT NSString *NSZoneName(NSZone * __nullable zone) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT NSZone * __nullable NSZoneFromPointer(void *ptr) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");

FOUNDATION_EXPORT void *NSZoneMalloc(NSZone * __nullable zone, NSUInteger size) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT void *NSZoneCalloc(NSZone * __nullable zone, NSUInteger numElems, NSUInteger byteSize) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT void *NSZoneRealloc(NSZone * __nullable zone, void * __nullable ptr, NSUInteger size) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT void NSZoneFree(NSZone * __nullable zone, void *ptr) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");

看起来跟C语言的malloc,calloc,free等函数相似,所以大概NSZone就是可以分配一段连续空间。你可以将你创建的类实例都存在这个空间,自己管理。

比如你都用allocWithZone创建三个NSDictionary ,那这三个字典肯定是连在一起存储的。然后你连着读取三字典的数据,地址相邻理论上读取速度更快。

反正当年肯定用这个有好处,现在苹果都帮你处理好了,不用管了,官方也不建议再用这个接口了。

那么最后答案就是:
alloc和allocWithZone都是创建一个类实例的方法
不同之处在于,alloc无法指定一个NSZone来存储自己创建的实例,它最终调用的是allocWithZone(nil),使用的是系统给定的NSZone
allocWithZone可以指定自己的NSZone来存储自己创建的实例,如果zone传nil 它使用的就是系统给定的NSZone

你可能感兴趣的:(NSZone 和 allocWithZone)