NSZone域

NSZone域可视为某种内存池结构,与其相关的实例对象值的内存区的创建(开辟)和释放(不需要时)都在这个对应管控的轻量级内存池里面进行。
NSZone域整体呈现出的特征层级为结构体层级风格,采用C结构存储着关于对象内存的管理信息(地址元素等管理信息),实现开辟分配内存及内存不需要使用时的释放回收。
CocoaApplication使用系统默认的NSZone域对应用中的对象实例对应的内存进行管理。
备注:当NSZone域里面管理着大量对象内存时,这些大量对象内存的批量释放可能会导致内存严重碎片化,虽然Cocoa本身每次Alloc开辟内存时会尝试去填满内存空隙,但是这样空隙填充会造成时间开销很大。
创建某个NSZone域结构实例,当代码中需要诸多内存片段时(开辟分配诸多内存(多次执行指令alloc时)),把alloc这种内存开辟指令全部转移到NSZone里面,可以减少时间的开销。
采用NSZone域结构实例可以把zone域结构实例里面的所分配对象内存全部一次性清除掉一次性回收内存空间,避免逐个对对象dealloc逐个释放所占用内存逐个内存空间回收,节省大量时间。
如for循环10000次,则把for循环语句体里面的alloc开辟分配的内存空间都全部放到自定义的NSZone域结构实例中,在for结束之后调用C库下NSZonefree释放函数实现对NSZone域结构实例中所有已分配的内存空间一次性释放回收。

NSObject基类默认遵循协议但默认并没有遵循<NSCopying、NSMutableCopying>协议。当自定义子类继承NSObject时也不会默认遵循<NSCopying、NSMutableCopying>协议,未遵循协议时如果直接调用Copy方法会触发Copy方法内部的copyWithZone事件(遵循NSCopying协议的事件)进而报错。所以需要实现copy事件时,则需要先添加NSCopying协议。

@protocol NSCopying

- (id)copyWithZone:(nullable NSZone *)zone;

@end

@protocol NSMutableCopying

- (id)mutableCopyWithZone:(nullable NSZone *)zone;

@end

当入参zone为nil时,采用系统给定的默认NSZone体用于开辟分配内存( 开辟分配内存的上下文体源自NSDefaultMallocZone() )
单纯使用copy或alloc事件时,copyWithZone和allocWithZone的入参都传nil,表示采用系统默认的NSZone分配内存的上下文体。
.zone表示返回该对象内存分配相对应的NSZone上下文体。


版权声明:本文为yanhaijunyan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。